Вкладений для циклів із використанням розуміння списку


85

Якби я мав два рядки, 'abc'і 'def', я міг би отримати всі їх комбінації, використовуючи два для циклів:

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...це внутрішній цикл.

По суті, ви можете мати стільки незалежних речень «для x в y», скільки вам потрібно для розуміння списку, просто дотримуючись один за одним.


1
Що робити, якщо ви хочете зробити вкладений цикл для ітерації вкладеного списку? Щось на кшталт: [print ('a') for ax in axes for axes in axes] друкує купу на [None, None ...] аж до len (axes)
Пабло Руїс Руїс

@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]чи що
Салік Малік

34

Оскільки це, по суті, декартовий продукт, ви також можете використовувати 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

Відповідно до запитання ОП, я думаю, що на виході повинні бути пари літер, і повинно бути 9 комбінацій.
Маттіа

Що сталося з: 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.