繁体   English   中英

Python:生成器中的产量字典元素?

[英]Python: Yield Dict Elements in generators?

在我说一句话之前,让我感谢社区成为我最近的编程查询权威位置。 并假装这些赞美不是用语言表达的。 无论如何,概率法则决定了我偶然发现了使用多功能搜索栏找不到的东西,所以我决定第一次明确要求。 也许我只是没有使用足够 Pythonic 的术语进行搜索。 或者我可能不喜欢谷歌搜索/Stackoverflowing。 不管...

我正在玩弄 Python 协程和生成器。 据我所知,你可以用生产者协程做任何生成器理解可以做的事情,尽管更冗长。 我目前正在使用 Python 3,尽管关于 Python 2 的任何答案也不会 go 错过。

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

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 安装。 如果我忽略该代码中的冗余示例,我会发现生成器理解很容易映射到生产者协程生成的生成器。 作为 Pragmatic 博士,我尝试将相同的概念映射到 dicts,因为 dict 理解已经存在,我认为这两个是等价的:

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()

第一个有效,但第二个无效。 它在第 3 行的冒号上标记语法错误。

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

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

字典推导确实像列表/集合推导和生成器表达式一样工作 - 带有expr for vars in iterable的 X 推导几乎等同于X(expr for vars in iterable) - 你已经知道如何打开生成器表达式到生成器中。 但请注意“相当多”位,因为直译不起作用(正如您所注意到的)并且根本没有必要(不会使实施变得更容易,实际上会很hacky)。

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

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

我想从 python function 中的产量生成一个字典并找到了这个问题。 下面是返回字典的代码。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM