# Nested For Loops Using List Comprehension

Each Answer to this Q is separated by one/two green lines.

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.

To make it more readable, use multiple lines:

``````lst = [
j + k         # result
for j in s1   # for loop
for k in s2 # for loop
# condition
]
``````

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

``````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 answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .