在键上连接两个 Python 字典
Joining two Python Dictionaries on key
在 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})
我想使用 "operator" 库的可能性并使用键进行连接,但该方法对我不起作用,因为我不知道我应该如何处理 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')]
谢谢!
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)
- 从 OrderedDict 列表中获取 ID 列表
- 从 dd 获取键列表
- 获取这些键的交集
- 从 dd 设置数量并删除 OrderedDict,如果它的 id 在 defaultdict 中丢失。
你可以试试这个:
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)])]
在 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})
我想使用 "operator" 库的可能性并使用键进行连接,但该方法对我不起作用,因为我不知道我应该如何处理 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')]
谢谢!
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)
- 从 OrderedDict 列表中获取 ID 列表
- 从 dd 获取键列表
- 获取这些键的交集
- 从 dd 设置数量并删除 OrderedDict,如果它的 id 在 defaultdict 中丢失。
你可以试试这个:
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)])]