我试图理解为什么这两个例子给了我不同的输出。
例1:
list1 = [1,2,3,4,5]
list2 = []
for l in list1:
list2.append(l)
print list2
#[1, 2, 3, 4, 5]
例2:
list1 = [1,2,3,4,5]
list2 = []
list2.append(l for l in list1)
print list2
#[<generator object <genexpr> at 0x10379ecd0>]
我已尝试在第二个示例中的追加后添加list()或tuple(),但它在新列表中给出了一个单独的元素,而不是5个不同的元素。
list2.append(tuple(l for l in list1))
#[(1, 2, 3, 4, 5)]
对于for循环,只有一行使用Example1可以获得相同的输出吗?
我真的很感激任何帮助!
答案 0 :(得分:4)
第二个例子
需要extend
而不是append
list1 = [1,2,3,4,5]
list2 = []
list2.extend(l for l in list1) # or just list2.extend(list1)
print list2
如果您只想复制list1
,那么
list2 = list1[:]
或
list2 = list(list1)
会这样做
答案 1 :(得分:3)
(l for l in list1)
是generator expression。它显式返回一个生成器,它本质上是一个节省内存的迭代器(想一个列表,但是每个元素都是动态返回的,而不是全部存储在内存中)。实现它的关键是生成器表达式,注意表达式被(
和)
所包围。
在list2.append(l for l in list1)
中,您已将单个生成器附加到空列表中。您仍然可以通过for element in list2[0]
获得所需的所有元素,但这不是一回事。
然而,在做
for l in list1:
list2.append(l)
没有遇到这样的生成器表达式。在每次迭代中 - 循环的每次运行 - l
,一个元素,被附加到末尾。因此,为什么这会以您的思维方式运作。
如果您希望使用与生成器表达式类似的内容list2
,则需要使用list comprehension代替:
list2 = [l for l in list1]
请注意,列表推导的结构与生成器表达式之间的区别仅仅是方括号[
,]
而不是括号。
答案 2 :(得分:0)
您不想在第二个示例中使用append。相反,你想要
list2 = [l for l in list1]
复制列表有更简单的方法,但这是与示例2中最匹配的方法。
答案 3 :(得分:0)
如果您不喜欢嵌套列表,那么您可以使用:
list1 = [1,2,3,4,5]
list2 = []
[list2.append(l) for l in list1]