2013-05-19 4 views
1

파이썬을 배우기의 일환으로 여러 가지 일을하는 데 어려움을 겪었습니다. 나의 현재 과제는 목록 이해력을 사용하여 쌍의 목록을 만드는 것입니다. 파트 1은 (x, y)가 같지 않아야하며 (x, y가 같지 않음) 문제 ((x, y)가 같지 않아야 함)의 목록을 만드는 것입니다.조합이리스트 내재에서 이미 존재하는지 확인

return [(x,y) for x in listOfItems for y in listOfItems if not x==y] 

기존 코드를 사용하여 그것을 수정 (x, y)에 이미 같은 목록에있는 경우 있도록 (y는, x)의 결과에서 제외 할 수 있습니까? 나는 단어 뒤에서 항목을 비교할 수 있다는 것을 알고 있지만, 목록 이해력으로 얼마나 많은 통제를 할 수 있는지보고 싶습니다.

저는 파이썬 2.7을 사용하고 있습니다.

답변

2

는 현재 발전기 기능을 사용한다 : 지능형리스트와 비슷하지만 게으른 평가하는 :

def func(listOfItems): 
    seen = set() #use set to keep track of already seen items, sets provide O(1) lookup 
    for x in listOfItems: 
     for y in listOfItems: 
      if x!=y and (y,x) not in seen: 
       seen.add((x,y)) 
       yield x,y 

>>> lis = [1,2,3,1,2] 
>>> list(func(lis)) 
[(1, 2), (1, 3), (1, 2), (2, 3), (1, 2), (1, 3), (1, 2), (2, 3)] 
+0

에서 unique_everseen 레시피를 (사용 I 천국으로 아직 코드에서 사용하지 않았 음). – RMDan

+0

@RMDan 'yield'는 일반 함수를 생성기로 변환하고 지연 평가에 사용됩니다. [generators] (http://wiki.python.org/moin/Generators)에 대해 자세히 읽어보십시오. –

+0

내가 예상 한 대답은 아니지만 더 좋습니다. 파이썬에 대한 새로운 것들과 쓸만한 코드를 작성하는 더 깨끗한 방법을 가르쳐줍니다. – RMDan

1
def func(seq): 
    seen_pairs = set() 
    all_pairs = ((x,y) for x in seq for y in seq if x != y) 
    for x, y in all_pairs: 
     if ((x,y) not in seen_pairs) and ((y,x) not in seen_pairs): 
      yield (x,y) 
     seen_pairs.add((x,y)) 

또는, 당신은 또한 (all_pairs 여기) generator expression를 사용할 수 있습니다. 그들은 있습니다 매우 도움이 조합을 반복 할 때, 특히 등

0

productsproductifilter뿐만 아니라 어떻게 항복 작품 궁금 해요 itertools

>>> x = [1, 2, 3, 1, 2] 
>>> x = product(x, x) 
>>> x = unique_everseen(x) 
>>> x = ifilter(lambda z: z[0] != z[1], x) 
>>> for y in x: 
...  print y 
... 
(1, 2) 
(1, 3) 
(2, 1) 
(2, 3) 
(3, 1) 
(3, 2) 
관련 문제