gpt4 book ai didi

python - 嵌套列表和生成器的迭代以及产量

转载 作者:行者123 更新时间:2023-11-28 21:57:16 25 4
gpt4 key购买 nike

我正在考虑创建一个简单的生成器来对两个具有嵌套值的列表的值求和。从堆栈中使用这个答案 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])

关于我需要的迭代、列表和产量,我没有得到什么?

最佳答案

生成器对象需要循环:

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

关于python - 嵌套列表和生成器的迭代以及产量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20070497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com