Вложенные циклы For с использованием понимания списка


88

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

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

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

Ответы:


136
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') для топора в топоре для топора в топоре] печатает кучу на [None, None ...] до len (топоров)
Пабло Руис Руис

@Pablo Я думаю, у тебя все поменялось местами. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

Порядок forоператоров такой же, как если бы вы написали его в виде двух forциклов на двух отдельных строках.
Борис

aaronasterling Могу ли я использовать условные операторы в следующих целях?
Салик Малик

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]или что-то в этом роде
Салик Малик

35

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

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, ade и т. Д.
Гарри Бинсвангер,

Это работает так: крайнее левое положение может быть только "a" или "d", среднее положение может быть только "b" или "e", а правое положение может быть только "c" или "f". .
Стефан Грюнвальд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.