python - 为什么在构造这个 defaultdict 的每个循环中 yield 不返回单独的值?

标签 python yield defaultdict

这是原始代码:

from collections import defaultdict

lis = [[1, 2], [2, 1], [3, 0], [2, 1], [1, 1]]

res = defaultdict(int)
for i, j in lis:
    res[i] += j
    print(res.items())

结果

dict_items([(1, 2)])
dict_items([(1, 2), (2, 1)])
dict_items([(1, 2), (2, 1), (3, 0)])
dict_items([(1, 2), (2, 2), (3, 0)])
dict_items([(1, 3), (2, 2), (3, 0)])

我想使用 yield 来获取这些打印的项目。

from collections import defaultdict

li = [[1, 2], [2, 1], [3, 0], [2, 1], [1, 1]]


def g(lis: list):
    res = defaultdict(int)
    for i, j in lis:
        res[i] += j
        yield res.items()


print(*g(li))

但是我明白了

dict_items([(1, 3), (2, 2), (3, 0)]) dict_items([(1, 3), (2, 2), (3, 0)]) dict_items([(1, 3), (2, 2), (3, 0)]) dict_items([(1, 3), (2, 2), (3, 0)]) dict_items([(1, 3), (2, 2), (3, 0)])

最佳答案

您在自己的回答中所说的是真实的。我只是想确保您明白,如果您将每个值收集到一个列表中,然后使用单个 print 语句打印该列表,那么您发现的这个事实对于您的第一个代码示例同样适用。 yield 与您遇到的问题没有任何关系。我希望您已经知道这一点,但我想指出这一点,以防稍后阅读本文的人可能认为这是使用 yield 引入的问题。它不是。

要查看这一点,您可以更改第二个示例以立即打印产生的值。这样,您在两个示例中都在做同样的事情……在生成下一个值后立即打印它。如果这样做,两个版本的代码都会得到相同的结果。

下面是一整套代码来证明这一点:

from collections import defaultdict

lis = [[1, 2], [2, 1], [3, 0], [2, 1], [1, 1]]

res = defaultdict(int)
for i, j in lis:
    res[i] += j
    print(res.items())

def g(lis: list):
    res = defaultdict(int)
    for i, j in lis:
        res[i] += j
        yield res.items()

for v in g(lis):
    # Print the next generated value
    print(v)

结果:

dict_items([(1, 2)])
dict_items([(1, 2), (2, 1)])
dict_items([(1, 2), (2, 1), (3, 0)])
dict_items([(1, 2), (2, 2), (3, 0)])
dict_items([(1, 3), (2, 2), (3, 0)])
dict_items([(1, 2)])
dict_items([(1, 2), (2, 1)])
dict_items([(1, 2), (2, 1), (3, 0)])
dict_items([(1, 2), (2, 2), (3, 0)])
dict_items([(1, 3), (2, 2), (3, 0)])

关于python - 为什么在构造这个 defaultdict 的每个循环中 yield 不返回单独的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65547378/

相关文章:

python - 以自定义方式解包列表的问题

python - 如何将 defaultdict(list) 转换为 Pandas DataFrame

python - Lua 中是否有 Python 的 defaultdict 功能

python - matplotlib pylot发生异常: ValueError

python - 基于 Django 类的 View - 线程问题?

python - 删除项目后重命名字典键的更好方法?

python - SGDClassifier.partial_fit 返回错误 "classes should include labels"

python - except 如何在 Python 中用于迭代器?

python - 为什么 next() 总是显示相同的值?

python - 无限嵌套的 defaultdict 是否有标准类?