如何用函数式编程风格编写这个python片段



如何使用例如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())

如果您想尝试以函数样式编写:

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

首先我们创建一个字典列表。

然后我们将CCD_ 1和CCD_。

然后我们将它们映射到set,为每个字典提供一组密钥。

最后,我们用set.intersection函数reduce这些集合。

实际上你的问题很不清楚。我会尽力帮助你:

首先,您不需要使用set而不是dict.keys():

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

您可以为您的小狗使用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)

这里有一个使用toolz的干净方法。使用map0和toolz.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风格的方法。这种模式很强大,可以扩展到更复杂的问题,因此值得学习。

相关内容

  • 没有找到相关文章

最新更新