gpt4 book ai didi

Python:在生成器中生成字典元素?

转载 作者:IT老高 更新时间:2023-10-28 21:12:35 26 4
gpt4 key购买 nike

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

我在玩 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 安装。如果我忽略该代码中的冗余示例,我会发现生成器理解很容易映射到生产者协程生成的生成器。作为 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:在生成器中生成字典元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6718324/

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