List Comprehension을 사용하는 중첩 For 루프


85

두 개의 문자열이 'abc'있고 'def', 두 개의 for 루프를 사용하여 모든 조합을 얻을 수 있습니다.

for j in s1:
  for k in s2:
    print(j, k)

그러나 목록 이해력을 사용하여 이것을 할 수 있기를 바랍니다. 나는 여러 가지 방법을 시도했지만 그것을 얻지 못했습니다. 누구든지 이것을하는 방법을 알고 있습니까?

답변:


133
lst = [j + k for j in s1 for k in s2]

또는

lst = [(j, k) for j in s1 for k in s2]

튜플을 원한다면.

질문에서와 같이 for j...외부 루프입니다.for k... 는 내부 루프입니다.

본질적으로, 당신은 목록 이해에서 원하는만큼 독립적 인 'for x in y'절을 가질 수 있습니다.


1
중첩 된 목록을 반복하기 위해 중첩 된 루프를 수행하려면 어떻게해야합니까? 다음과 같습니다. [print ( 'a') for axs in axs in axes] is printing a bunch on [None, None ...] up to len (axes)
Pablo Ruiz Ruiz

@ Pablo 나는 당신이 당신의 루프를 뒤집 었다고 생각합니다. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

for명령문 의 순서는 for두 개의 개별 행에 두 개의 루프 로 작성한 것과 동일 합니다.
Boris

aaronasterling 다음에서 조건문을 사용할 수 있습니까?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]또는 뭔가
Salik Malik

34

이것은 본질적으로 데카르트 곱이기 때문에 itertools.product 를 사용할 수도 있습니다 . 특히 입력 iterable이 더 많을 때 더 명확하다고 생각합니다.

itertools.product('abc', 'def', 'ghi')

0

재귀도 시도하십시오.

s=""
s1="abc"
s2="def"
def combinations(s,l):
    if l==0:
        print s
    else:
        combinations(s+s1[len(s1)-l],l-1)
        combinations(s+s2[len(s2)-l],l-1)

combinations(s,len(s1))

8 가지 조합을 제공합니다.

abc
abf
aec
aef
dbc
dbf
dec
def

OP의 질문에 따라 출력은 몇 개의 문자를 제공해야하고 9 개의 조합이 있어야한다고 생각합니다.
Mattia

abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe 및 c, e 또는 f로 시작하는 모든 항목은 어떻게 되었습니까? 순서는 중요하지 않다하더라도, 생략은 다음과 같습니다 등 BDA, 에이드,
해리 빈스 완저

이것이 작동하는 방식은 가장 왼쪽 위치는 "a"또는 "d"만 가능하고 중간 위치는 "b"또는 "e"만 가능하며 오른쪽 위치는 "c"또는 "f"만 될 수 있다는 것입니다. .
Stefan Gruenwald
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.