2011-03-11 1 views
1

목록이 있다고 가정하고 순서를 고려하지 않고 모든 고유 한 요소 쌍 목록을 생성하려고합니다. 이 작업을 수행하는 한 가지 방법은 다음과 같습니다반복자를 복사하고 순서가 매겨지지 않은 셀프 카르티지 생성물을 생성합니다.

mylist = ['W','X','Y','Z'] 
for i in xrange(len(mylist)): 
    for j in xrange(i+1,len(mylist)): 
     print mylist[i],mylist[j] 
W X 
W Y 
W Z 
X Y 
X Z 
Y Z 

내가 반복자와 함께이 작업을 수행하려면, 나는 간결하지 않는 경우에도, 다음과 같은 생각 :

import copy 
it1 = iter(mylist) 
for a in it1: 
    it2 = copy.copy(it1) 
    for b in it2: 
     print a,b 

을하지만이조차하지 않습니다 작업. iterator 나 zip 등을 사용하여 더 파이썬적이고 효율적인 방법은 무엇입니까?

+0

for i in mylist: do_something_to(i) 

을한다. – Apalala

+0

@Apalala, downvote 주셔서 감사합니다. 그러나 실제로 나는 코딩 중이며 검색하는 동안 다른 유사한 질문을 찾을 수 없습니다. – highBandWidth

답변

6

이 이미 완료되었습니다 파이썬 2.6과 같은 표준 라이브러리에 포함되어

import itertools 

mylist = ['W', 'X', 'Y', 'Z'] 
for pair in itertools.combinations(mylist, 2): 
    print pair  # pair is a tuple of 2 elements 

는 많은 계산하는 경우에도 것을

주 ;-) 나에게 꽤 파이썬 보인다 의 조합을 사용하는 경우 combinations() 함수는 반복기를 반환하므로 즉시 인쇄를 시작할 수 있습니다. docs을 참조하십시오.

또한 결과는 목록과 그 자체 사이의 데카르트 곱으로 참조되지만, 정확하지는 않습니다. 데카르트 곱이 16 개의 요소 (4x4)를 갖습니다. 귀하의 결과물은 목록의 값 중 2 요소 인 combinations (반복 허용되지 않음)의 하위 집합입니다.

+1

네 말이 맞아, 나는 그걸 조합이라고 불러야 했어. 그걸로 나에게 대답을 얻었을거야! – highBandWidth

0

@ 카메론의 대답은 정확합니다.

난 그냥

for i in range(len(mylist)): 
    do_something_to(mylist[i]) 

이 더럽게되지 않은 파이썬이라고 지적하고 싶었다; 당신의 작업이 읽기 전용의 경우, (배열에 다시 저장 할 필요가 없습니다) 그것은 오늘이 숙제 질문을 본 적이 두 번째 시간입니다, 그렇지 않으면

mylist = [do_something_to(i) for i in mylist] 
+0

동의하지만 인덱스를 참조해야하므로 range (len (mylist))를 수행했습니다. – highBandWidth

+0

열거 형을 사용할 수도 있습니다. 예 : "인덱스의 경우 열거 형의 값 (mylist) : print (인덱스, 값)" – utdemir

관련 문제