在key上加入两个Python Dictionaries

时间:2018-03-17 18:55:08

标签: python dictionary ordereddictionary defaultdict

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

第一个字典“d”是OrderedDict,如下所示:

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

第二个“dd”是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)

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

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

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

理想的输出将是OrderedDict,其中包含第二个字典中的附加值:

{{1}}

谢谢!

2 个答案:

答案 0 :(得分: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. 获取这些键的交集
  5. 如果在defaultdict中缺少ID,则从dd设置数量并删除OrderedDict。
  6. https://ideone.com/ZXVcQu

答案 1 :(得分:0)

你可以试试这个:

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)])]