猿问

什么是字典键的交集

我正在尝试使用 map、filter、reduce 编写一个单行函数,它采用字典列表 (Ld) 并返回包含在所有字典中的键的集合(键的交集)。


下面的函数试图做到这一点。如果键在特定字典中,则映射部分返回 True/False 的集合。如果所有这些元素都为真,则reduce 返回True。最后,过滤部分过滤掉所有不满足这些条件的键。


def intersection_of_keys(Ld):

    return filter(lambda key: reduce(lambda x, y: x*y, map(lambda dic: key in dic, Ld)), all_keys(Ld))


#For example:  

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]  

print(intersection_of_keys(Ld))  

代码应该打印一个包含 1 和 3 的集合。但是地图部分内的变量key是未定义的。任何想法为什么不将键传递到映射的 lambda 函数定义中?以及如何解决这个问题的任何想法?


侃侃尔雅
浏览 199回答 3
3回答

慕码人8056858

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}

ITMISS

您可以考虑使用带有set和的单衬&:from functools import reduced1 = {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]

天涯尽头无女友

我无法重现您的错误。如果我运行您提供的代码(替换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,因此您可以将许多东西作为单个操作传递给它。
随时随地看视频慕课网APP

相关分类

Python
我要回答