Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:迭代列表时的生成器对象_Python - Fatal编程技术网

Python:迭代列表时的生成器对象

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

当在一个列表上迭代并附加到另一个列表时,我得到了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)
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,我想最初的答案有一个包含在列表中的生成器表达式@乔兰比斯利:是的!考虑到这一点,这是一个相当愚蠢的输入错误。连接已经创建了一个新的列表对象,切片副本是多余的。