2010-09-03 2 views
51

Если бы я имел две строки, 'abc' и 'def', я мог бы получить все комбинации из них, используя два для петель:Вложенные Для Loops Использование списка Постижение

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

Однако, я хотел бы быть в состоянии сделать это, используя список понимание. Я пробовал много способов, но так и не смог. Кто-нибудь знает как это сделать?

ответ

86
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... является внутренней петлей.

По существу, вы можете иметь столько независимых предложений «для x в y», сколько хотите в понимании списка, просто придерживаясь один за другим.

+0

+1, так как OP попросил LC-х. –

27

Поскольку это по существу декартово произведение, вы также можете использовать itertools.product. Я думаю, что это яснее, особенно когда у вас больше входных итераций.

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

+1, потому что продукт является более приятным ответом, чем LC's для этого –

+0

itertools снова наносит удар! Хорошее решение –

0

Try рекурсии тоже:

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 
+0

Удовлетворение вопроса OP, я думаю, что выход должен давать пары букв, и должно быть 9 комбинаций. – Mattia

+0

Что случилось с: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe и все, начиная с c, e или f? Даже если порядок не важен, пропущены: bda, ade и т. Д. –

+0

Как это работает, то, что крайнее левое положение может быть только «a» или «d», средняя позиция может быть «b» или «b», e ", а правильное положение может быть только" c "или" f ". –