为了账号安全,请及时绑定邮箱和手机立即绑定

什么是字典键的交集

什么是字典键的交集

侃侃尔雅 2021-10-26 16:49:04
我正在尝试使用 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 函数定义中?以及如何解决这个问题的任何想法?
查看完整描述

3 回答

?
慕码人8056858

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}


查看完整回答
反对 回复 2021-10-26
?
ITMISS

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]


查看完整回答
反对 回复 2021-10-26
?
天涯尽头无女友

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,因此您可以将许多东西作为单个操作传递给它。


查看完整回答
反对 回复 2021-10-26
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号