Python:在协同程序中产生Dict元素?

Lou*_*uis 17 python dictionary list-comprehension generator

在我说一句话之前,让我感谢社区作为我最近编程查询权威位置.并假装那些称赞不是用文字表达的.无论如何,概率定律指出我偶然发现了使用多功能搜索栏找不到的东西,所以我决定第一次明确要求.也许我只是没有使用Pythonic-enough语言进行搜索.或许我在Googling/Stackoverflowing吮吸.而不管...

我正在玩Python协同程序和生成器.从我可以收集到的,你可以做任何生成器理解可以与生产者协同程序,尽管更冗长.我目前正在使用Python 3,尽管有关Python 2的任何答案都不会错过.

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

one_to_three = (num for num in range(1, 4))
Run Code Online (Sandbox Code Playgroud)

...

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

one_to_three_gen = one_to_three()
Run Code Online (Sandbox Code Playgroud)

它适用于我的Python安装.如果我忽略该代码中的冗余 - 如此常见的示例,我看到生成器理解很容易映射到生成器协同程序生成的生成器.作为Pragmatic博士,我尝试将相同的概念映射到dicts,因为dict理解已经存在,我认为这两个是等价的:

one_to_three_doubles = {num : num * 2 for num in range(1, 4)}
Run Code Online (Sandbox Code Playgroud)

...

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

one_to_three_doubles_gen = one_to_three_doubles()
Run Code Online (Sandbox Code Playgroud)

第一个可以工作,但第二个没有.它标记第3行冒号上的语法错误.

现在,要么我在语法上略微下滑,要么我对生产者协程如何工作有很大的误解.我怀疑它的失败是因为你不能让coroutine返回列表而不是生成器,但我真的不知道.

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

小智 21

字典理解确实像列表/集合理解和生成器表达式一样工作 - 具有"正文"的X理解expr for vars in iterable几乎相当于X(expr for vars in iterable)- 并且您已经知道如何将生成器表达式转换为生成器.但请注意"几乎"一点,因为字面翻译不起作用(正如您所注意到的)并且根本不需要(不会使实现更容易并且实际上非常hacky).

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

def one_to_three_doubles():
    for num in range(1, 4):
        yield num, num * 2
Run Code Online (Sandbox Code Playgroud)

  • 要创建字典,请使用`dict(one_to_three_doubles())` (3认同)

Hun*_*phu 5

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

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

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

print(f())
# Output:
{'key1': 10, 'key2': 20}
Run Code Online (Sandbox Code Playgroud)