Вложенные петли, использующие понимание списков
Если бы у меня было две строки, 'abc'
и 'def'
, я мог бы получить все их комбинации, используя два для циклов:
for j in s1:
for k in s2:
print(j, k)
Однако я хотел бы иметь возможность сделать это, используя понимание списка. Я пробовал много способов, но так и не смог. Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
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", сколько хотите в понимании списка, просто придерживаясь один за другим.
Ответ 2
Так как это по существу декартово произведение, вы также можете использовать itertools.product. Я думаю, что это яснее, особенно когда у вас больше итераций ввода.
itertools.product('abc', 'def', 'ghi')
Ответ 3
Попробуйте также рекурсию:
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