如何在列表中合并循环嵌套字典?

时间:2020-09-06 14:22:04

标签: python dictionary nested

我有一个字典词典:

[
            {
                "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 ...
        ]

3 个答案:

答案 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()]
相关问题