我有一个字典词典:
[
{
"eid_number": "984000714187062",
"hours": 0,
"management_id": "9",
"outings": {
"out": "2020-09-05T12:00:00Z",
"_in": "2020-09-05T18:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T09:03:26Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714190010",
"hours": 6.0,
"management_id": "13",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
}
]
eid_number以7088结尾的母牛有两个对象。 我正在寻找一种将两个词典结合在一起的方法。
但是我需要将嵌套的郊游词典更新为包含合并字典值的列表。
[
# Rest of object from before ...
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings":[
{
"out": "2020-09-05T09:03:26Z",
"_in": "2020-09-05T12:00:00Z"
},
{
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
]
},
# Rest of object from before ...
]
答案 0 :(得分:0)
如果您不喜欢可读性,请尝试使用groupby
:
from itertools import groupby
from operator import itemgetter
l = [
{
"eid_number": "984000714187062",
"hours": 0,
"management_id": "9",
"outings": {
"out": "2020-09-05T12:00:00Z",
"_in": "2020-09-05T18:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T09:03:26Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714190010",
"hours": 6.0,
"management_id": "13",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
}
]
print([{k: v if k != 'outings' else list(map(itemgetter("outings"), sub)) for i in sub for k, v in i.items()} for eid, sub_tmp in groupby(l, key=itemgetter("eid_number")) for sub in [list(sub_tmp)]])
一种可读的方式:
r = []
for eid, sub in groupby(l, key=itemgetter("eid_number")):
tmp = {}
outings = []
for d in sub:
for k, v in d.items():
if k == "outings":
outings.append(v)
else:
tmp.update({k:v})
tmp.update(outings=outings)
r.append(tmp)
print(r)
所有结果都是:
[{'eid_number': '984000714187062', 'hours': 0, 'management_id': '9', 'outings': [{'out': '2020-09-05T12:00:00Z', '_in': '2020-09-05T18:00:00Z'}]}, {'eid_number': '984000714187088', 'hours': 12.0, 'management_id': '8', 'outings': [{'out': '2020-09-05T09:03:26Z', '_in': '2020-09-05T12:00:00Z'}, {'out': '2020-09-05T06:00:00Z', '_in': '2020-09-05T12:00:00Z'}]}, {'eid_number': '984000714190010', 'hours': 6.0, 'management_id': '13', 'outings': [{'out': '2020-09-05T06:00:00Z', '_in': '2020-09-05T12:00:00Z'}]}]
答案 1 :(得分:0)
使用简单的迭代。
例如:
result = {}
for i in data:
outings = i.pop('outings')
if i['eid_number'] not in result:
result[i['eid_number']] = {**i, 'outings': []}
result[i['eid_number']]['outings'].append(outings)
print(list(result.values()))
输出:
[{'eid_number': '984000714187062',
'hours': 0,
'management_id': '9',
'outings': [{'_in': '2020-09-05T18:00:00Z', 'out': '2020-09-05T12:00:00Z'}]},
{'eid_number': '984000714187088',
'hours': 12.0,
'management_id': '8',
'outings': [{'_in': '2020-09-05T12:00:00Z', 'out': '2020-09-05T09:03:26Z'},
{'_in': '2020-09-05T12:00:00Z', 'out': '2020-09-05T06:00:00Z'}]},
{'eid_number': '984000714190010',
'hours': 6.0,
'management_id': '13',
'outings': [{'_in': '2020-09-05T12:00:00Z', 'out': '2020-09-05T06:00:00Z'}]}]
答案 2 :(得分:0)
仅提供其他选择,这是我的看法:
from collections import defaultdict
l = [
{
"eid_number": "984000714187062",
"hours": 0,
"management_id": "9",
"outings": {
"out": "2020-09-05T12:00:00Z",
"_in": "2020-09-05T18:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T09:03:26Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714187088",
"hours": 12.0,
"management_id": "8",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
},
{
"eid_number": "984000714190010",
"hours": 6.0,
"management_id": "13",
"outings": {
"out": "2020-09-05T06:00:00Z",
"_in": "2020-09-05T12:00:00Z"
}
}
]
temp_dict = defaultdict(list)
for d in l:
o = d.pop("outings")
temp_dict[tuple(d.values())].append(o)
r = [{'eid_number': eid_number, 'hours': hours, 'management_id': management_id, 'outings': outings} for (eid_number, hours, management_id), outings in temp_dict.items()]