【问题标题】:Python merge dictionaries based on valuePython基于值合并字典
【发布时间】:2013-03-03 21:18:28
【问题描述】:

我有两个字典(Python),我根据值(不是键)合并它们。但是,我的方法效率很低,基本上是 O(n^2)。有没有更好的办法?

本例中的字典本质上是一个整数键,值是一个元组(5 个元素长),都是整数。

谢谢!

例子:

字典A:{25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}

字典 B:{46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

合并后的字典是:{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}。请注意,字典 A 的第一个元素与字典 B 的第一个元素具有相同的值元组,因此,我们只选择一个

【问题讨论】:

  • 您能否详细介绍一下这种“价值合并”?例如,您可以发布两个示例词典和合并词典的所需结果。键和值之间是否存在双射?
  • 当然,字典 A: {25: 1, 5, 1, 5}, {34: 5, 24, 5, 24} 字典 B: {46: 1, 5, 1, 5} , {29: 5, 23, 1, 5}。合并后的字典将是:{25: 1, 5, 1, 5}, {34: 5, 24, 5, 24}, {29: 5, 23, 1, 5}。请注意,字典 A 的第一个元素与字典 B 的第一个元素具有相同的值元组,因此,我们只选择一个。
  • @OP,最好编辑你的问题,不要添加 cmets。
  • @OP A: {25: 1, 5, 1, 5} 不是字典。你的意思是A = {25: (1, 5, 1, 5) }吗?
  • @OP:你根据什么决定是保留密钥25还是密钥46

标签: python dictionary merge


【解决方案1】:

可能是这样的吗?

a = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
b = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

for k, v in b.items ():
    if v not in a.values (): a [k] = v

print (a)

但我猜它仍然是 O(n**2)。

编辑: 对于大型字典,这应该更快:

c = {}
for k, v in a.items (): c [v] = k
for k, v in b.items (): c [v] = k

c = dict ( (b, a) for a, b in c.items () )
print (c)

【讨论】:

  • 另外,请使用a.iteritems() 避免在字典中创建新的项目列表。
【解决方案2】:

我可能会这样做:

from collections import defaultdict

A = {25: (1, 5, 1, 5), 34: (5, 24, 5, 24)}
B = {46: (1, 5, 1, 5), 29: (5, 23, 1, 5)}

vk = defaultdict(list)
sources = A, B
for source in sources:
    for k,v in source.iteritems():
        vk[v].append(k)

out = {v[0]:k for k,v in vk.iteritems()}

它总是取sources中最早的键,并产生

>>> out
{25: (1, 5, 1, 5), 34: (5, 24, 5, 24), 29: (5, 23, 1, 5)}

如果内存是一个问题,您可以更改vk[v].append(k) 行;现在它建立了一个不需要的中间结构,但我不完全确定在碰撞情况下正确的选择逻辑应该是什么。

【讨论】:

    【解决方案3】:

    对我有用的是

    C={v:k for k,v in {v:k for k, v in B.items()+A.items()}.iteritems()}
    

    ..这是紧凑的代码,可能只和O(n*log(n)) 一样昂贵,因为所做的一切都是在字典中插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2016-02-20
      • 2011-01-22
      相关资源
      最近更新 更多