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

时间:2015-05-28 17:17:59

标签: python

我在遍历列表并附加到其他列表时获取生成器对象。

>>> 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'

如何将值从一个列表添加到另一个现有列表?

2 个答案:

答案 0 :(得分:1)

您需要将生成器表达式包装在方括号中以将其转换为列表:

c=[i for i in a]

那就是说,当你可以使用

时,这是一个冗余生成器
c = a + b

因为您没有更改或评估列表中的任何元素,并且连接会创建一个新列表。

答案 1 :(得分:1)

两个问题: A)您要将生成器与列表混合使用 B)您希望使用列表方法extend()而不是append() }。

A)列表与生成器

当您写下:a = [1, 2, 3, 4]时,您正在创建一个列表,并将其称为a

当您写下:c = (i for i in a)时,您正在创建一个生成器并将其称为c

如果您想将a追加到c,首先必须将c转换为列表。这可以通过以下两种方式完成:

  1. 从头开始制作一个列表: c = [i for i in a]将返回包含a中所有元素的列表。这称为列表理解。

  2. 将生成器转换为列表:

    c = (i for i in a)
    c = list(c)
    
  3. 既然c是一个列表,您可以将b附加到其中:

    c.append(b) [1, 2, 3, 4, [6, 7, 8, 9]]

    噢,哦,看! Append将另一个元素添加到列表的末尾,该元素可以是另一个列表。在这种情况下,c的第5个元素是另一个列表。

    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
    

    OR

    list1 = ['a', 'b', 'c']
    list2 = ['x', 'y', 'z']
    list3 = [i for i in list1] + [j for j in list2]
    

    练习列表推导