迭代嵌套列表和生成器以及yield

时间:2013-11-19 11:37:21

标签: python iteration generator

我正在考虑创建一个简单的生成器来将两个列表的值与嵌套值相加。 从堆栈中使用此答案https://stackoverflow.com/a/17014386/461887和此答案What does the "yield" keyword do in Python?

所以我创建了2个列表

a = ([1, 2], [2, 3])

b = ([3, 4], [5, 6])

创建了一个错误的生成器。

In [10]: def sumNest(item1, item2):
    ...:     try:
    ...:         for i in iter(item1):
    ...:             for j in iter(item2):
    ...:                 yield i + j
    ...:     except TypeError:
    ...:         yield item
    ...:         

我可以毫无错误地创建它但它不起作用(以我期望的方式)。

In [14]: def sumNest(item1, item2):
    ...:     try:
    ...:         for i in iter(item1):
    ...:             for j in iter(item2):
    ...:                 k = (i + j)
    ...:                 yield k
    ...:     except TypeError:
    ...:         yield item
    ...:         

我的使用结果期望总和输出。

In [17]: sumNest(a, b)
Out[17]: <generator object sumNest at 0x7f313e6e74b0>

In [18]: answer = sumNest(a, b)

In [19]: answer
Out[19]: <generator object sumNest at 0x7f313e6e7230>

In [20]: print answer
<generator object sumNest at 0x7f313e6e7230>

In [21]: answer(a, b)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-badcb4bdaf5d> in <module>()
----> 1 answer(a, b)

TypeError: 'generator' object is not callable

这导致我回过头来得到这个结果而不是按预期添加列表我最终得到了连接。

a = ([1, 2], [2, 3])

b = ([3, 4], [5, 6])

for i in a:
    ...:     for j in b:
    ...:         print(i + j)
    ...:         
[1, 2, 3, 4]
[1, 2, 5, 6]
[2, 3, 3, 4]
[2, 3, 5, 6]

现在这是一个不错的结果,但不会再次出现(预期会增加)所以结果如下:

([4, 6], [7, 9])

我没有得到关于我需要的迭代,列表和事件的什么?

3 个答案:

答案 0 :(得分:2)

生成器对象需要循环

for summed in sumNest(a, b):
    print summed

或者,您可以使用生成器上的next() function从中获取一个值。

您的第一个示例出现语法错误,因为您拼写错误yield。您的异常处理程序尝试yield item,但该函数实际上并未定义该名称。

请注意,您的解决方案都没有使列表变得平坦,您仍在“总结”元组。

工作示例:

>>> a = ([1, 2], [2, 3])
>>> b = ([3, 4], [5, 6])
>>> def summedProduct(iter1, iter2):
...     for i in iter(iter1):
...         for j in iter(iter2):
...             yield i + j
... 
>>> for summed in summedProduct(a, b):
...     print summed
... 
[1, 2, 3, 4]
[1, 2, 5, 6]
[2, 3, 3, 4]
[2, 3, 5, 6]

如果您想要展平列表,先将它们展平 ,然后zip()将展平的结果合并为:

def summedNested(nested1, nested2):
    flattened1 = (v for nested in nested1 for v in nested)
    flattened2 = (v for nested in nested2 for v in nested)
    for i, j in zip(flattened1, flattened2):
        yield i + j

演示:

>>> def summedNested(nested1, nested2):
...     flattened1 = (v for nested in nested1 for v in nested)
...     flattened2 = (v for nested in nested2 for v in nested)
...     for i, j in zip(flattened1, flattened2):
...         yield i + j
... 
>>> for summed in summedNested(a, b):
...     print summed
... 
4
6
7
9

答案 1 :(得分:2)

answer是生成器对象,您可以从中生成(生成)列表:

result = list(answer)

答案 2 :(得分:1)

简单地调用生成器将为您提供生成器对象。您需要迭代它或使用next函数来获取值。例如,

next(sumNest(a, b))

会对你有用。或者循环迭代

for item in sumNext(a, b):
    print item

例如

def sumNest(item1, item2):
  try:
      for i in iter(item1):
          for j in iter(item2):
              k = (i + j)
              yield k
  except TypeError:
      yield item1

print next(sumNest([1, 2], [3, 4]))
print
for item in sumNest([1, 2], [3, 4]):
    print item,

<强>输出

4

4 5 5 6

当你说I created 2 lists

a = ([1, 2], [2, 3])
b = ([3, 4], [5, 6])

您创建的tuples不是lists