[英]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.pipe
和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
风格的方法。 这种模式功能强大,可以扩展到更复杂的问题,值得学习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.