development

목록의 각 항목을 나머지 항목과 한 번만 비교하는 방법은 무엇입니까?

big-blog 2021. 1. 10. 19:50
반응형

목록의 각 항목을 나머지 항목과 한 번만 비교하는 방법은 무엇입니까?


비교하고 싶은 배열 / 목록이 있다고 가정 해 보겠습니다. 더 익숙한 언어로 다음과 같이 할 것입니다.

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

참조 URL : https://stackoverflow.com/questions/16603282/how-to-compare-each-item-in-a-list-with-the-rest-only-once

반응형