3 回答

TA贡献1803条经验 获得超6个赞
filter, reduce, map, 和lambda...天哪!这是 Python,记住,所以不要让它变得比它需要的更难。只需使用一个好的 ol' for 循环:
>>> keys, *morekeys = [d.keys() for d in Ld]
>>> for k in morekeys:
... keys &= k
...
>>> keys
{1, 3}
如果你坚持使用reduce,是这样的:
>>> from functools import reduce
>>> from operator import and_
>>> reduce(and_, [d.keys() for d in Ld])
{1, 3}

TA贡献1871条经验 获得超8个赞
您可以考虑使用带有set和的单衬&:
from functools import reduce
d1 = {1:12, 3:4, 2:5}
d2 = {1:6, 3:8, 0:9}
d3 = {3:0, 1:11, 2:3}
Ld = [d1, d2, d3]
reduce(lambda x, y: x&y.keys(), Ld)
>>>{1, 3}
如果你不能使用set和&必须坚持使用reduce:
reduce(lambda x, y: [i for i in x if i in y], Ld)
>>>[1, 3]
最后,如果您甚至不能使用列表推导式并且需要使用filter:
list(reduce(lambda x, y: filter(lambda a: a in y, x) , Ld))
>>>[1, 3]

TA贡献1831条经验 获得超9个赞
我无法重现您的错误。如果我运行您提供的代码(替换all_keys(Ld)为(k for d in Ld for k in d),并将调用包装起来,list以便它用完filter),我会得到:
[1, 3, 1, 3, 3, 1]
这虽然是多余的,但准确地描述了它们出现的顺序重叠的键。
也就是说,如果你没有需要写出来与.keys()/ map/ filter/ reduce,有很多更好的方法来做到这一点,只要按键的确切顺序,和上面看到的,不需要输出的冗余:
def intersection_of_keys(Ld):
return set(Ld[0]).intersection(*Ld[1:])
就是这样; set.intersection采用 varargs,因此您可以将许多东西作为单个操作传递给它。
添加回答
举报