2011-04-22 2 views
4

이것을 할 수 있다는 것을 알고 계셨습니까?파이썬 : for-loop 용 단선 직교 곱

>>> [(x,y) for x in xrange(2) for y in xrange(5)] 
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4)] 

깔끔합니다. for 루프 버전이 있습니까? 아니면 목록 작성을 위해서만 할 수 있습니까?

편집 : 제 질문은 잘못 이해 된 것 같습니다. 이 특수 구문이 있다면 내가 알고 싶은 :

for x in xrange(2) <AND> y in xrange(5): 
    print "do stuff here" 
    print "which doesn't fit into a list comprehension" 
    print "like printing x and y cause print is a statement", x, y 

내가이 작업을 수행 할 수는 있지만, 반복적 인 비트 것 같다, 더 컴팩트 버전

for x,y in ((x,y) for x in xrange(2) for y in xrange(5)): 
    print x, y 
+3

아니요, 불가능합니다. 그건 단지리스트 - 이해를위한 것입니다. – rubik

+1

+1 루비가 정확합니다.이 구문은 지원되지 않습니다. – samplebias

+0

@ samplebias : 대답 하나만 대답으로 받아 들일 수 있다면 대답은 – Claudiu

답변

7

원하는 구문에 대한 설명이 없지만 itertools.product이 있습니다.

>>> import itertools 
>>> for x, y in itertools.product([1,2,3,4], [5,6,7,8]): print x, y 
... 
1 5 
1 6 
1 7 
1 8 
[ ... and so on ... ] 
5

동등한입니다 :

def values(): 
    for x in xrange(2): 
     for y in xrange(5): 
      yield (x, y) 
list(values()) 

업데이트 : 모두의 바이트 코드를 비교하려면 다음을 수행하십시오

import dis 
print dis.dis(values) # above function 

gen = ((x,y) for x in xrange(2) for y in xrange(5)) 
print dis.dis(gen.gi_code) 
+0

은 정확히 일치합니까? (파이썬은 실제로 모든 목록 이해를 위해 생성기를 만드나요?). 그렇지 않으면 물론 출력은 동일합니다. – Claudiu

+0

그래, 제네레이터가 좀 더 효율적이라고 생각하지만 바이트 코드는 꽤 가깝습니다. – samplebias

+0

물론, 모든 목록 이해를위한 완전한 폐기 생성기는 정의하지 않습니다. 또한 파이썬 수준 루프로 그것을 언 롤링하지 않습니다. 그러나 이러한 구현 세부 사항은 중요하지 않으며이 예제가 생성자를 정의한다는 사실도 마찬가지입니다. 중요한 루프의 중첩입니다. (편집 : 질질 끌기 위해, OP는 특수 바이트 코드로 다르게 구현되는 목록 이해력을 사용합니다!) – delnan