Вложено для циклов с использованием понимания списка - PullRequest
72 голосов
/ 03 сентября 2010

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

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

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

Ответы [ 3 ]

114 голосов
/ 03 сентября 2010
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', сколько хотите в понимании списка, просто вставляя одно за другим.

31 голосов
/ 03 сентября 2010

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

itertools.product('abc', 'def', 'ghi')
0 голосов
/ 25 марта 2014

Попробуйте также рекурсию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...