简体   繁体   中英

Nested For Loops Using List Comprehension

If I had two strings, 'abc' and 'def' , I could get all combinations of them using two for loops:

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

However, I would like to be able to do this using list comprehension. I've tried many ways, but have never managed to get it. Does anyone know how to do this?

lst = [j + k for j in s1 for k in s2]

or

lst = [(j, k) for j in s1 for k in s2]

if you want tuples.

Like in the question, for j... is the outer loop, for k... is the inner loop.

Essentially, you can have as many independent 'for x in y' clauses as you want in a list comprehension just by sticking one after the other.

Since this is essentially a Cartesian product, you can also use itertools.product . I think it's clearer, especially when you have more input iterables.

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

It's just a ready-to-go version of @miles82 answer (please give credit where it's due):

from itertools import product
list(map(list, product('abc', 'def') ))

Output:

[['a', 'd'],
 ['a', 'e'],
 ['a', 'f'],
 ['b', 'd'],
 ['b', 'e'],
 ['b', 'f'],
 ['c', 'd'],
 ['c', 'e'],
 ['c', 'f']]

In case you wondered why we need list(map(list - itertools.product returns an iterator.

Try recursion too:

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))

Gives you the 8 combinations:

abc
abf
aec
aef
dbc
dbf
dec
def

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM