簡體   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