Python:迭代列表时的生成器对象
当在一个列表上迭代并附加到另一个列表时,我得到了generator对象Python:迭代列表时的生成器对象,python,Python,当在一个列表上迭代并附加到另一个列表时,我得到了generator对象 >>> a=[1,2,3,4] >>> b=[6,7,8,9] >>> c=None >>> c=(i for i in a) >>> c <generator object <genexpr> at 0x1070baaa0> >>> c.append(i for i in b) Traceba
>>> a=[1,2,3,4]
>>> b=[6,7,8,9]
>>> c=None
>>> c=(i for i in a)
>>> c
<generator object <genexpr> at 0x1070baaa0>
>>> c.append(i for i in b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'generator' object has no attribute 'append'
如何将值从一个列表添加到另一个现有列表?您需要将生成器表达式包装在方括号中,以将其转换为列表:
c=[i for i in a]
c = (i for i in a)
c = list(c)
这就是说,这是一个冗余的发电机时,你可以只使用
c = a + b
由于您没有更改或计算列表中的任何元素,因此连接将创建一个新列表。两个问题:a您将生成器与列表混淆,B您希望使用列表方法extend而不是append
A列表与生成器
当您编写:a=[1,2,3,4]时,您正在创建一个列表并将其引用为a
当你在a中为i写:c=i时,你正在创建一个生成器,并将其称为c
如果您想将a附加到c,首先必须将c转换为列表。这可以通过两种方式实现:
从一开始就将其列为一个列表:
c=[i代表a中的i]将返回一个包含a中所有元素的列表。这称为列表理解
将生成器转换为列表:
c=[i for i in a]
c = (i for i in a)
c = list(c)
现在c是一个列表,您可以在其中附加b:
c、 附录B
[1,2,3,4,6,7,8,9]]
哦,小心!Append将另一个元素添加到列表的末尾,该元素可以是另一个列表。在这种情况下,c的第5个元素是另一个列表
>>> a=[1,2,3,4]
>>> b=[6,7,8,9]
>>> c=None
>>> c=(i for i in a)
>>> c
<generator object <genexpr> at 0x1070baaa0>
>>> c.append(i for i in b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'generator' object has no attribute 'append'
B使用extend代替append
您真正想要的是使用列表的extend方法。此方法将iterable中的所有元素附加到调用该方法的iterable
c = [1, 2, 3, 4]
b = [6, 7, 8, 9]
c.extend(b)
[1, 2, 3, 4, 6, 7, 8, 9]
[====c=====] [====b====]
此外,如果您只想创建一个包含前两个列表元素的新列表,则可以执行以下操作:
list1 = ['a', 'b', 'c']
list2 = ['x', 'y', 'z']
list3 = list1 + list2
或
要练习你对列表的理解,c是一个生成器,你期望会发生什么?如果你想得到一个列表而不是生成器,请用方括号替换括号。如果你想要一份do c=a[:]的副本,为什么所有的反对票都会出现?当然c=a[:]更聪明,但这是OP的生成器表达式列表expression@JoranBeasley,我想最初的答案有一个包含在列表中的生成器表达式@乔兰比斯利:是的!考虑到这一点,这是一个相当愚蠢的输入错误。连接已经创建了一个新的列表对象,切片副本是多余的。