簡體   English   中英

如何以函數式編程風格編寫此 python 片段?

[英]How to write this python snippet in functional programming style?

如何使用例如toolz在功能 python 中編寫以下行?

dct1 = {1: 1, 2: 2}
dct2 = {2:2}
dct3 = {2:2, 3:3}

common_keys = set(dct1.keys()) & set(dct2.keys()) & set(dct3.keys())

實際上你的問題很不清楚。 我會盡力幫助你:

首先,您不需要使用set over dict.keys()

dct1.keys() & dct2.keys() & dct3.keys()
# returns {2}

您可以為您的 puprose 使用reduce函數:

from functools import reduce    


def key_intersection(*dicts):
    if len(dicts) == 0:
        return set([])
    if len(dicts) == 1:
        return set(dicts[0])
    return reduce(lambda l, r: l & r.keys(), dicts[1:], set(dicts[0]))


key_intersection(dct1, dct2, dct3)

如果您想嘗試以功能樣式編寫此代碼:

from functools import reduce

dct1 = {1: 1, 2: 2}
dct2 = {2: 2}
dct3 = {2: 2, 3: 3}

shared_keys = reduce(set.intersection, map(set, map(dict.keys, [dct1, dct2, dct3])))

首先,我們創建一個字典列表。

然后我們將dict.keys函數map到它們中的每一個。

然后我們將它們映射到set ,為每個字典提供一組鍵。

最后,我們使用set.intersection函數reduce這些集合。

這是使用toolz的干凈方法。 使用toolz.pipetoolz.curried通常會使事情更容易編寫和閱讀:

import operator as op
from toolz import pipe
from toolz.curried import map, reduce

pipe(
    [dct1, dct2, dct3],
    map(op.methodcaller("keys")),
    reduce(op.and_)
)

我發現你的問題很清楚,我會說這是最好的功能toolz風格的方法。 這種模式功能強大,可以擴展到更復雜的問題,值得學習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM