Nested list comprehension with two lists

100,378

Solution 1

The reason it has 9 numbers is because python treats

[x + y for x in l2 for y in l1 ]

similarly to

for x in l2:
    for y in l1:
       x + y

ie, it is a nested loop

Solution 2

List comprehensions are equivalent to for-loops. Therefore, [x + y for x in l2 for y in l1 ] would become:

new_list = []
for x in l2:
    for y in l1:
        new_list.append(x + y)

Whereas zip returns tuples containing one element from each list. Therefore [x + y for x,y in zip(l1,l2)] is equivalent to:

new_list = []
assert len(l1) == len(l2)
for index in xrange(len(l1)):
    new_list.append(l1[index] + l2[index])

Solution 3

The above answers will suffice for your question but I wanted to provide you with a list comprehension solution for reference (seeing as that was your initial code and what you're trying to understand).

Assuming the length of both lists are the same, you could do:

[l1[i] + l2[i] for i in range(0, len(l1))]

Solution 4

[x + y for x in l2 for y in l1 ]

is equivalent to :

lis = []
for x in l:
   for y in l1:
      lis.append(x+y)

So for every element of l you're iterating l2 again and again, as l has 3 elements and l1 has elements so total loops equal 9(len(l)*len(l1)).

Solution 5

this sequence

res = [x + y for x in l2 for y in l1 ]

is equivalent to

res =[]
for x in l2:
    for y in l1:
        res.append(x+y)
Share:
100,378
André Caldas
Author by

André Caldas

Updated on July 05, 2022

Comments

  • André Caldas
    André Caldas almost 2 years

    I understand how the simple list comprehension works eg.:

    [x*2 for x in range(5)] # returns [0,2,4,6,8]
    

    and also I understand how the nested list comprehesion works:

    w_list = ["i_have_a_doubt", "with_the","nested_lists_comprehensions"]
    
    # returns the list of strings without underscore and capitalized
    print [replaced.title() for replaced in [el.replace("_"," ")for el in w_list]]
    

    so, when I tried do this

    l1 = [100,200,300]
    l2 = [0,1,2]
    [x + y for x in l2 for y in l1 ]
    

    I expected this:

    [100,201,302]
    

    but I got this:

    [100,200,300,101,201,301,102,202,302]
    

    so I got a better way solve the problem, which gave me what I want

    [x + y for x,y in zip(l1,l2)]
    

    but I didn't understood the return of 9 elements on the first code

  • Mad Physicist
    Mad Physicist about 7 years
    Alternatively, you can enumerate one of the lists, so you will only have to index one of them.
  • Mickey Perlstein
    Mickey Perlstein over 5 years
    xrange is much better memory optimized
  • sohnryang
    sohnryang over 5 years
    @MickeyPerlstein It's a bit late, but in python 3, range is equal to xrange.