两个列表的嵌套列表内涵

我知道简单的列表内涵是如何运作的,例如:

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

我也理解了嵌套列表理解是如何工作的:

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

所以,当我试着这么做的时候

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

我早就料到了:

[100,201,302]

但我有这个:

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

所以我有更好的办法解决这个问题,这给了我我想要的

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

但我不明白第一段代码中9个元素的返回

112797 次浏览

它之所以有9个数字是因为 python

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

类似于

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

即,它是一个嵌套循环

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

等同于:

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

因此,对于 l的每个元素,都要反复迭代 l2,因为 l有3个元素,而 l1有元素,所以总循环等于9(len(l)*len(l1))。

列表理解等价于 for 循环。因此,[x + y for x in l2 for y in l1 ]将变成:

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

zip返回的元组包含每个列表中的一个元素,因此 [x + y for x,y in zip(l1,l2)]等价于:

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

这个序列

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

相当于

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

上面的答案对你的问题来说已经足够了,但是我想提供一个列表内涵的解决方案给你参考(因为这是你最初的代码,也是你试图理解的东西)。

假设两个列表的长度相同,你可以这样做:

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