【发布时间】:2019-04-05 06:25:11
【问题描述】:
在 Python 3.7 中,我想计算两个字典键的交集。为此,我想在他们的keys() 上调用.intersection() 方法,但是它不起作用。
.keys() 产生一个类似集合的对象,但是大多数集合方法都不能处理它。然而,有效的是类集合对象的极其未知的按位运算符重载,例如&。
m = {'a':1, 'b':2}
n = {'b':3, 'c':4}
m.keys().intersection(n.keys()) # Pythonic, but doesn't work
m.keys() & n.keys() # works but not readable
set(m.keys()).intersection(set(n.keys())) # works, readable, but too verbose
我发现类似集合的对象上的& 重载极少使用,并且大多数程序员都不知道。像 .intersection() 或 .union() 这样的方法名称是自文档化的,而且按照这个定义肯定更符合 Python 风格。
那为什么不支持呢?甚至documentation 也列出了& 和.intersection() 方法,如别名,更不用说只支持& 在类集合对象上。
注意: 出于某种原因,在 IPython 中,自动完成功能将.isdisjoin() 列为dict.keys() 上可用的方法。在 17 种设置方法中,存在 1 种。
【问题讨论】:
-
如果您担心过于冗长,则无需在最后一个示例中将
n.keys转换为set:set(m.keys()).intersection(n.keys()) -
虽然不同意应该支持方法以符合预期的一般观点,但我发现各种运算符的重载相当直观,并且更喜欢它们而不是过于冗长(并且经常令人困惑)的名称方法。我知道所有按位运算符的作用类似于它们对位的作用。
^立即有意义,但symmetric_difference总是需要一些时间来注册;<和<=马上就清楚了,但issubset模仿的是哪个不是。 -
@sacul:就此而言,您无需致电
.keys();set(m).intersection(n)将等效地工作,因为dicts 已经像他们自己的值的唯一迭代一样。打扰.keys()的唯一 原因是获得类似集合的行为;如果您无论如何要转换为set,则不需要它。 -
@ShadowRanger 所以你说最干净的代码实际上是:
set(m).intersection(n),对吧? -
@hyperknot:或者只是
m.keys() & n.keys()(实际上,m.keys() & n也可以正常工作,但让它像那样不对称感觉很奇怪)。
标签: python python-3.x dictionary set dictview