2013-05-17 2 views
33

내가 비교하고 싶은 것의 배열/목록이 있다고해라. 더 익숙한 언어로는 다음과 같이 할 것입니다.나머지 목록과 각 목록 항목을 비교하는 방법은 단 한 번입니까?

for (int i = 0, i < mylist.size(); i++) 
    for (int j = i + 1, j < mylist.size(); j++) 
     compare(mylist[i], mylist[j]) 

이렇게하면 각 쌍을 한 번만 비교할 수 있습니다. 일부 컨텍스트의 경우 목록에 포함 된 많은 개체에 대해 충돌 검색을 수행하고 있습니다. 감지 된 각 충돌에 대해 충돌을 설명하는 작은 '충돌'개체가 목록에 추가됩니다. 그러면 충돌하는 두 개체의 특성에 따라 다른 루틴이 각 충돌을 해결합니다. 분명히, 나는 한 번만 각 충돌을보고하고 싶다.

파이썬은 인덱스를 반복하기보다는 반복자를 사용하기 때문에이 작업을 수행하는 비법은 무엇입니까?

나는 다음 (버그) 코드했다 :

for this in mylist: 
    for that in mylist: 
     compare(this, that) 

을하지만이 명확하게 해결하려고 할 때 이상한 동작이 발생할 된 두 번 각각의 충돌을 선택합니다. 그렇다면이 pythonic 솔루션은 무엇입니까?

+0

나는 "비교"가 무엇을 의미하는지 모르겠습니다. 내가 할 수있는 일은 해시 테이블에 하나의 목록을 넣은 다음 두 번째 목록에서 루프를 수행하는 것입니다. 각 반복마다 비교를 검색 할 것입니다. – Luixv

답변

64

.

당신은 모든 가능한 조합을 생성하기 위해 여기에 몇 가지 itertools 마법을 사용할 수 있습니다

import itertools 
for a, b in itertools.combinations(mylist, 2): 
    compare(a, b) 

itertools.combinations는 반복 가능한 각각의 다른 요소와 각 요소 쌍을하지만, 한 번만 것입니다.


당신이 사용하는 어떤 당신은 여전히 ​​중첩 for 루프를 사용하는 것과 사용하여이 인덱스 기반 항목 액세스를 작성할 수

:

for i in range(len(mylist)): 
    for j in range(i + 1, len(mylist)): 
     compare(mylist[i], mylist[j]) 

이 같은 좋은 파이썬 보일 수 있습니다 물론을하지만, 때로는 이것이 여전히 가장 쉽고 이해하기 쉬운 해결책이므로, 그런 문제를 해결하는 데서 벗어나지 말아야합니다.

+0

좋아요! 설명과 링크에 감사드립니다. 나는 itertools 모듈에 대해 몰랐지만,보기에 편리했다. – Bogdanovist

+0

@poke'name 'compare'is not defined 어떻게 해결할 수 있습니까? – 3kstc

+1

@ 3kstc 나는 질문에서 그것을 가져 갔다. 각 항목 쌍을 사용하여 원하는 것으로 바꾸십시오. – poke

16

for 루프 목록의 모든 항목을 통과하므로이 두 번 각 쌍을 생성합니다 물론 사용 itertools.combinations(mylist, 2)

mylist = range(5) 
for x,y in itertools.combinations(mylist, 2): 
    print x,y 

0 1 
0 2 
0 3 
0 4 
1 2 
1 3 
1 4 
2 3 
2 4 
3 4 
+1

정말 도움이됩니다. 감사. – theteddyboy

-2

이 코드는 주파수를 계산하고 제거합니다 중복 요소 :

from collections import Counter 

str1='the cat sat on the hat hat' 

int_list=str1.split(); 

unique_list = [] 
for el in int_list: 

    if el not in unique_list: 
     unique_list.append(el) 
    else: 
     print "Element already in the list" 

print unique_list 

c=Counter(int_list) 

c.values() 

c.keys() 

print c 
0

내가 외부 루프에 enumerate를 사용하고 내부 루프의 목록을 슬라이스 인덱스를 사용하여 생각은 파이썬 예쁜 :

for index, this in enumerate(mylist): 
    for that in mylist[index+1:]: 
     compare(this, that) 
관련 문제