목록의 각 항목을 나머지 항목과 한 번만 비교하는 방법은 무엇입니까?
비교하고 싶은 배열 / 목록이 있다고 가정 해 보겠습니다. 더 익숙한 언어로 다음과 같이 할 것입니다.
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)
그러나 이것은 분명히 각 충돌을 두 번 선택하여 해결하려고 할 때 이상한 동작으로 이어집니다. 그렇다면 여기서 파이썬적인 해결책은 무엇입니까?
물론 이것은 각 for
루프가 목록의 모든 항목을 통과 하므로 각 쌍을 두 번 생성 합니다.
가능한 모든 조합을 생성하기 위해 여기에서 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])
물론 이것은 멋지고 비단뱀처럼 보이지 않을 수도 있지만 때때로 이것은 여전히 가장 쉽고 이해하기 쉬운 해결책이므로 그런 문제를 해결하는 것을 주저해서는 안됩니다.
사용하다 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
내가 사용 생각 열거를 외부 루프와 내부 루프의 목록을 슬라이스 인덱스를 사용하는 것은 꽤 파이썬입니다 :
for index, this in enumerate(mylist):
for that in mylist[index+1:]:
compare(this, that)
이 코드는 빈도를 계산하고 중복 요소를 제거합니다.
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
'development' 카테고리의 다른 글
특정 길이의 단어와 일치하는 정규식 (0) | 2021.01.10 |
---|---|
knockout.js에 조건부로 요소 속성 추가 (0) | 2021.01.10 |
CSS에서 target =“_ blank”사용 (0) | 2021.01.10 |
단일 데이터베이스에서 테이블 이름을 필터링 할 수 있어야합니까? (0) | 2021.01.10 |
C에서 구조체 또는 구조체에 대한 포인터를 반환할지 여부를 어떻게 선택합니까? (0) | 2021.01.10 |