我理解的简单列表理解是如何工作的:如
[x*2 for x in range(5)] # returns [0,2,4,6,8]
而且据我所知,嵌套列表comprehesion是如何工作的:
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 ]
我预计:
[101,202,303]
但我得到了这一点:
[100,200,300,101,201,301,102,202,302]
所以我得到了一个更好的办法解决这个问题,这给了我我想要的
[x + y for x,y in zip(l1,l2)]
但我不明白9个元素,第一个代码返回
它有9个数字的原因是因为蟒蛇对待
[x + y for x in l2 for y in l1 ]
类似
for x in l2:
for y in l1:
x + y
即,它是一个嵌套循环
List内涵相当于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])
以上答案就足够了你的问题,但我想向您提供参考列表理解的解决方案(如看到这是你最初的代码,以及你想了解)。
假设长度的两个列表都是一样的,你可以这样做:
[l1[i] + l2[i] for i in range(0, len(l1))]
[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)
这个序列
res = [x + y for x in l2 for y in l1 ]
相当于
res =[]
for x in l2:
for y in l1:
res.append(x+y)