【问题标题】:How to add the values of two OrderedDict objects in python, keeping the order?如何在python中添加两个OrderedDict对象的值,保持顺序?
【发布时间】:2016-11-10 18:39:25
【问题描述】:

我想添加两个 OrderedDict 对象,如下所示:

dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])])
dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])])

并像这样创建一个新的OrderedDict(顺序很重要):

dict3 = OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])])

如果 dict1dict2 中的任何键在另一个中不存在,则应忽略这些键,仅应将匹配的键用于输出。所有值都是列表。

【问题讨论】:

  • 你想要一个 new 字典作为输出,对吧?不更新dict1dict2 中的列表。
  • 实际上,更新任何字典都可以。
  • 我已经清理了你的问题并添加了一个假设:所有值都是列表。
  • 另一种极端情况:如果dict2 中的顺序dict1 的顺序不同会发生什么?

标签: python dictionary ordereddictionary


【解决方案1】:

因为您想保留 OrderedDict 对象的顺序,所以您需要循环一个对象并针对另一个键测试每个键以生成两个键集的并集:

dict3 = OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2)

循环 dict1 确保我们以相同的顺序输出新字典的键,使用 k in dict2 进行测试确保我们只使用 both 输入映射中存在的键。

您还可以使用list.extend() 就地更新dict1

for key, value in dict1.items():
    if key in dict2:
        value.extend(dict2[key])

演示:

>>> from collections import OrderedDict
>>> dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])])
>>> dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])])
>>> OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2)
OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])])

【讨论】:

  • 这完全符合我的需要!非常感谢 Martijn!
  • @Martijn Pieters 如何推广第一个解决方案以添加 N OrderedDict(()?
  • @azal:没有捷径,重复操作即可。
【解决方案2】:
dict3 = {}
for i in dict1:
    if i in dict2:
        dict3[i]=[]
        for j in dict1[i]:
            dict3[i].append(j)
        for j in dict2[i]:
            dict3[i].append(j)

【讨论】:

  • 请注意,由于您只是使用字典,因此无法保证顺序。
  • 因为它首先遍历dict1 的元素,然后遍历dict2,所以我认为特定键的所有值都是有序的。让我知道我的想法是否错误。 :)
  • 这取决于你如何理解“保持秩序”。从原始代码使用 OrderedDicts 的事实来看,我认为要求是对键和值进行排序。
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 2013-03-21
  • 1970-01-01
  • 2016-11-08
  • 2021-06-15
  • 2019-08-05
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多