【问题标题】:Python 3 - intersection of multiple dictionary keyPython 3 - 多个字典键的交集
【发布时间】:2015-10-29 00:15:43
【问题描述】:

下面是我的代码,谁能帮我用python 3内置库函数优化这个过程?

Dict1 = {'ky1':1, 'ky2':2,'ky_3':3}
Dict2 = {'ky1':4, 'ky2':5,'ky_4':6}
Dict3 = {'ky2':7, 'ky3':8,'ky_5':9}
D = [Dict1,Dict2,Dict3]
Keys_list = []
for i in D:
   tmp = list(i.keys())
   Keys_list.append(tmp)
Output = list(set.intersection(*map(set,Keys_list)))

我的Dict1、Dict2、Dict3是大字典
谢谢

【问题讨论】:

  • 在你上面的例子中你想要什么作为输出?

标签: python python-3.x dictionary key intersection


【解决方案1】:

如果您只想要所有字典中所有键的列表,您可以使用dict.viewkeys()(适用于 Python 2.7)或 Python 3.x 中的dict.keys(),获取字典视图对象,然后将它们相交.

Python 3.x 示例 -

>>> Dict1 = {'ky1':1, 'ky2':2,'ky_3':3}
>>> Dict2 = {'ky1':4, 'ky2':5,'ky_4':6}
>>> Dict3 = {'ky2':7, 'ky3':8,'ky_5':9}
>>>
>>> Dict1.keys() & Dict2.keys() & Dict3.keys()
{'ky2'}
>>> list(Dict1.keys() & Dict2.keys() & Dict3.keys())
['ky2']

对于 Python 2.7 使用 Dict1.viewkeys() 等,而不是 .keys()


如果您有一个字典列表,使用functools.reduce() 函数在一行中执行此操作的一种方法是 -

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}]
>>> res = list(reduce(lambda x, y: x & y.keys() , ld))
>>> res
['ky2']

类似的逻辑,使用for循环-

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}]
>>> res = ld.pop()
>>> for d in ld:
...     res = res & d.keys()
...
>>> list(res)
['ky2']

【讨论】:

  • 亲爱的 Anand S Kumar,感谢您的建议,但我有多个字典(说大小 N),每个字典都有(很多键,说 - 10k),那么如何解决这个问题?谢谢,
  • 字典是如何存储的?
【解决方案2】:

如果我正确理解了您的问题,您正在寻找所有三个字典中的交叉键,对吗?

如果是这样,你只需要遍历其中一个,过程很简单。

isect = [i for i in Dict1 if all(i in d for d in (Dict1,Dict2,Dict3))]

print(isect)

列表推导遍历一个字典,并在所有三个字典中查找每个项目。如果存在,它将被添加到列表中。你会得到:

['ky2']

作为输出。

【讨论】:

  • 亲爱的 Renae Lider,提前感谢您的建议,但我有多个字典(说大小 N),每个字典都有(很多键,说 - 10k),那么如何解决这个问题?谢谢,
  • @ChinLim 字典查找是一个 O(1) 操作(平均)。您不必担心尺寸。 O(n) 是最坏的情况。
  • 你不需要检查 i in d 是否为 Dict1,因为你已经知道这是真的,因为你迭代了 i in Dict1,所以你可以从最后一个元组中省略 Dict1。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2012-04-12
  • 2012-06-24
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多