【问题标题】:Python: Appending a function that yields to a list?Python:附加一个产生列表的函数?
【发布时间】:2023-03-17 13:40:02
【问题描述】:

您好,感谢您查看我的问题!我最近被介绍给生成器,并阅读了关于“Python yield 关键字解释”的内容。根据我的理解,yield 是动态生成的,不能被索引,并且会在 yield 命令执行后记住它在哪里中断(如果我错了,请纠正我,我还是新手)。

我的问题是为什么会这样:

from itertools import combinations

x = [['4A'],['5A','5B','5C'],['7A','7B']]

y = list()

for combination in x:
    for i in range(1,len(combination)+1):
        y.append(list(combinations(combination,i)))
print y # [[('4A',)], [('5A',), ('5B',), ('5C',)], 
        # [('5A', '5B'), ('5A', '5C'), ('5B', '5C')], 
        # [('5A', '5B', '5C')], [('7A',), ('7B',)], [('7A', '7B')]]

但这不起作用:

from itertools import combinations

x = [['4A'],['5A','5B','5C'],['7A','7B']]

y = list()

for combination in x:
    for i in range(1,len(combination)+1):
        y.append((combinations(combination,i)))
print y

既然我在 y 生成后直接将组合附加到它,为什么当它以列表形式附加时它可以工作,但当我正常执行时,它不起作用?

【问题讨论】:

  • 生成器本身就是一个对象。在第一种情况下,您将传递给list 构造函数的结果附加到y 列表中。但是,在第二种情况下,您将生成器对象本身附加到该列表中,而不是从其中创建的 list

标签: python list yield


【解决方案1】:

当您调用list(generator_function()) 时,generator_function 被迭代到耗尽,并且每个元素都存储在一个列表中。所以,这三个操作在做同样的事情:

l = list(generator_function())
...
l = [x for x in generator_function()]
...
l = []
for x in generator_function():
    l.append(x)

在您的示例中,不包括list(..),您只是将combinations 生成器对象附加到y。使用list(...),您将遍历combinations 生成器以构建list 对象,然后将其附加到y

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2020-09-12
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多