嵌套列表理解有两个列表(Nested list comprehension with two lis

2019-09-03 09:26发布

我理解的简单列表理解是如何工作的:如

[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个元素,第一个代码返回

Answer 1:

它有9个数字的原因是因为蟒蛇对待

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

类似

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

即,它是一个嵌套循环



Answer 2:

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


Answer 3:

以上答案就足够了你的问题,但我想向您提供参考列表理解的解决方案(如看到这是你最初的代码,以及你想了解)。

假设长度的两个列表都是一样的,你可以这样做:

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


Answer 4:

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



Answer 5:

这个序列

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

相当于

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


文章来源: Nested list comprehension with two lists