Python:在生成器中生成Dict元素?

2024-05-11 08:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在我说一句话之前,让我感谢社区最近为我的编程查询提供权威位置。假装那些赞美不是用语言表达的。不管怎么说,概率定律告诉我,我偶然发现了一些我用万能搜索栏找不到的东西,所以我决定第一次明确要求。也许我只是没有用Python的行话来搜索。或者我在google/stackoverflow上很差劲。不管怎样。。。

我在玩Python协同程序和生成器。据我所知,你可以做任何一个生成器理解可以与生产者协程,尽管更详细。我目前正在使用Python 3,尽管任何关于Python 2的回答都不会错过。

所以我假设下面的代码片段是等价的:

one_to_three = (num for num in range(1, 4))

。。。

def one_to_three():
    for num in range(1, 4):
        yield num

one_to_three_gen = one_to_three()

它适用于我的Python安装。如果我忽略了在该代码中的示例中常见的冗余,我会看到生成器理解很容易映射到生成器协同程序生成的生成器。作为实用主义博士,我试着将同样的概念映射到听写,因为听写理解已经存在,我认为这两个概念是等价的:

one_to_three_doubles = {num : num * 2 for num in range(1, 4)}

。。。

def one_to_three_doubles():
    for num in range(1, 4):
        yield num : num * 2

one_to_three_doubles_gen = one_to_three_doubles()

第一个可行,但第二个不行。它在第三行的冒号上标记语法错误。

现在,要么我在语法上有点疏忽,要么我对生产者协同工作的工作方式有很大的误解。我怀疑它失败的原因和你不能让一个协程返回一个列表而不是一个生成器的原因一样,但我真的不知道。

所以是的,我要求的基本上就是解决这个错误;提前谢谢。我更喜欢一个能告诉我答案的答案,而不是给我一个全新的方法来实现这个结果,但显然如果这是唯一的方法。。。


Tags: to代码infordefrangeonenum
2条回答

Dict理解的工作方式与list/set理解和生成器表达式类似——一个“body”为expr for vars in iterable的X理解相当于X(expr for vars in iterable)——而且您已经知道如何将生成器表达式转换为生成器。但是请注意“几乎”这一点,因为直译不起作用(如您所注意到的),也完全没有必要(并不会使实现变得更容易,而且实际上会相当麻烦)。

听写理解只是有一点点语法糖,看起来更像听写文字(冒号)。从语义上讲,这是没有必要的-没有什么特别的。停下来想一想:dict理解必须在每次迭代中产生两个值,一个键和一个值。这正是冒号所代表的-(key, value)对(记住,dict接受一个可数的(key, value)对)。你不能在听写理解之外使用这种语法糖,但是你可以只使用元组对。因此,等效发电机应为:

def one_to_three_doubles():
    for num in range(1, 4):
        yield num, num * 2

我想从python函数中的yield生成一个dict,并发现了这个问题。下面是返回dict的代码

def _f():
    yield 'key1', 10
    yield 'key2', 20

def f(): return dict(_f())

print(f())
# Output:
{'key1': 10, 'key2': 20}

相关问题 更多 >