답변:
모듈 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에서 도입되었습니다.
permutations()및 combinations()사용 r=2대신에 repeat=2대한 예제를 사용product()
비슷한 문제가 있었고 여기 에서 해결책을 찾았습니다 . 모듈을 가져올 필요없이 작동합니다.
다음과 같은 목록을 가정합니다.
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')
편집 :이 솔루션을 단순화하기 위해 재 작업 한 후 Adam Rosenfield와 동일한 접근 방식임을 깨달았습니다. 더 큰 설명이 일부 사람들이 더 잘 이해하는 데 도움이되기를 바랍니다.