【问题标题】:Joining two Python Dictionaries on key在键上加入两个 Python 字典
【发布时间】:2018-08-26 16:47:29
【问题描述】:

在 Python 中有两个字典,并希望使用键进行连接。

第一个字典“d”是这样的 OrderedDict:

[OrderedDict([
          ('id', '1'),
          ('date', '20170101'),
OrderedDict([
          ('id', '2'),
          ('date', '20170102'),
OrderedDict([
          ('id', '3'),
          ('date', '20170102')]

第二个“dd”是defaultdict,是这样的:

defaultdict(int, {'1': 14, '2': 5, '3': 7})

我想使用“运算符”库的可能性和使用键进行连接,但该方法对我不起作用,因为我不知道应该如何处理 defaultdict 中的键:

sort_key = operator.itemgetter("id")

ks=[ k for k in dd.keys()]

for i, j in zip(sorted(d, key=sort_key), sorted(dd,key=ks)):
    i.update(j)

我应该如何正确执行加入?

理想的输出将是 OrderedDict 以及来自第二个字典的附加值:

[OrderedDict([
          ('id', '1'),
          ('date', '20170101'),
          ('quantity', '14'),
OrderedDict([
          ('id', '2'),
          ('date', '20170102'),
          ('quantity', '5'),
OrderedDict([
          ('id', '3'),
          ('date', '20170102'),
          ('quantity', '7')]

谢谢!

【问题讨论】:

  • 加入后它们会是什么样子?如果您创建一个Minimal, Complete, and Verifiable 示例,您将获得更多更好的答案。尤其要确保输入和预期的测试数据是完整的(不是伪数据),并且可以很容易地剪切和粘贴到编辑器中,以便测试建议的解决方案。
  • 您可能应该使用更好的数据格式。如果ids 是唯一的,则将 OrderedDicts 放入字典中。

标签: python dictionary ordereddictionary defaultdict


【解决方案1】:
from collections import OrderedDict, defaultdict


d = [OrderedDict([
          ('id', '1'),
          ('date', '20170101')]),
OrderedDict([
          ('id', '2'),
          ('date', '20170102')]),
OrderedDict([
          ('id', '3'),
          ('date', '20170102')]) ]

dd = defaultdict(int, {'1': 14, '2': 5, '3': 7})
id1 = set([ di['id'] for di in d])
id2 = set( dd.keys() )
final_keys = id1 & id2
to_be_del = []
for di in d:
    id = di['id']
    if id not in final_keys:
        to_be_del.append(di)
        continue
    q = dd[id]
    di['quantity'] = q
for di in to_be_del:
    d.remove(di)

print(d)
  1. 从 OrderedDict 列表中获取 id 列表
  2. 从 dd 获取键列表
  3. 获取这些键的交集
  4. 从 dd 设置数量,如果默认字典中缺少 OrderedDict 的 id,则删除它。

https://ideone.com/ZXVcQu

【讨论】:

    【解决方案2】:

    你可以试试这个:

    from collections import OrderedDict, defaultdict
    d = [OrderedDict([
          ('id', '1'),
          ('date', '20170101')]),
        OrderedDict([
          ('id', '2'),
          ('date', '20170102')]),
        OrderedDict([
          ('id', '3'),
          ('date', '20170102')])]
    
    marker = defaultdict(int, {'1': 14, '2': 5, '3': 7})
    new_d = [OrderedDict([(a, b) for a, b in i.items()]+[('quantity', marker[i['id']])]) for i in d] 
    

    输出:

    [OrderedDict([('id', '1'), ('date', '20170101'), ('quantity', 14)]),
    OrderedDict([('id', '2'), ('date', '20170102'), ('quantity', 5)]),
    OrderedDict([('id', '3'), ('date', '20170102'), ('quantity', 7)])]
    

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多