목록의 모든 요소 쌍에 대한 작업
Python을 사용하여 목록에서 가능한 모든 쌍을 비교하고 싶습니다.
내가 가지고 있다고 가정
my_list = [1,2,3,4]
목록에서 두 요소의 모든 조합에 대해 작업을 수행하고 싶습니다 (foo라고 부르겠습니다).
최종 결과는 다음과 같아야합니다.
foo(1,1)
foo(1,2)
...
foo(4,3)
foo(4,4)
내 첫 번째 생각은 수동으로 목록을 두 번 반복하는 것이었지만 그다지 비단 해 보이지는 않습니다.
모듈 product()에서 확인하십시오 itertools. 그것은 당신이 설명하는 것과 정확히 일치합니다.
import itertools
my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
foo(*pair)
이것은 다음과 동일합니다.
my_list = [1,2,3,4]
for x in my_list:
for y in my_list:
foo(x, y)
편집 : 이 아니라 두 개의 매우 유사한 기능이 있고, permutations()하고 combinations(). 차이점을 설명하려면 :
product() 모든 중복을 포함하여 가능한 모든 요소 쌍을 생성합니다.
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
permutations()각 고유 요소 쌍의 모든 고유 순서를 생성하여 x,x중복을 제거합니다 .
. 1,2 1,3 1,4
2,1 . 2,3 2,4
3,1 3,2 . 3,4
4,1 4,2 4,3 .
마지막으로 combinations()사전 순으로 고유 한 각 요소 쌍만 생성합니다.
. 1,2 1,3 1,4
. . 2,3 2,4
. . . 3,4
. . . .
이 세 가지 함수는 모두 Python 2.6에서 도입되었습니다.
비슷한 문제가 있었고 여기 에서 해결책을 찾았습니다 . 모듈을 가져올 필요없이 작동합니다.
다음과 같은 목록을 가정합니다.
people = ["Lisa","Pam","Phil","John"]
단순화 된 단선 솔루션은 다음과 같습니다.
중복을 포함하여 가능한 모든 쌍 :
result = [foo(p1, p2) for p1 in people for p2 in people]
중복을 제외한 모든 가능한 쌍 :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
순서가 무관 한 고유 쌍 :
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
작동하고 싶지 않고 쌍을 얻기 위해 함수를 제거하고 foo튜플 만 사용하면 충분합니다.
중복을 포함하여 가능한 모든 쌍 :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
결과:
('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')
중복을 제외한 모든 가능한 쌍 :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
결과:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
순서가 무관 한 고유 쌍 :
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
결과:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Edit: After the rework to simplify this solution, I realised it is the same approach than Adam Rosenfield. I hope the larger explanation helps some to understand it better.
If you're just calling a function, you can't really do much better than:
for i in my_list:
for j in my_list:
foo(i, j)
If you want to collect a list of the results of calling the function, you can do:
[foo(i, j) for i in my_list for j in my_list]
which will return you a list of the result of applying foo(i, j) to each possible pair (i, j).
my_list = [1,2,3,4]
pairs=[[x,y] for x in my_list for y in my_list]
print (pairs)
참고URL : https://stackoverflow.com/questions/942543/operation-on-every-pair-of-element-in-a-list
'Program Club' 카테고리의 다른 글
| 대상 장치가 온라인 상태가되기를 기다리는 중 (0) | 2020.10.15 |
|---|---|
| Swift 4의 Decodable 프로토콜에서 사용자 지정 키를 어떻게 사용합니까? (0) | 2020.10.15 |
| 왜 사용! (0) | 2020.10.15 |
| jquery 클릭이 ajax 생성 콘텐츠에서 작동하지 않습니다. (0) | 2020.10.15 |
| PHP-FPM 및 Nginx : 502 불량 게이트웨이 (0) | 2020.10.15 |