将对象列表转换为列表字典

Convert a list of objects to a dictionary of lists

我有一个 JSON 对象的列表,已经排序(比方说按时间排序)。每个 JSON 对象都有 typestatus。例如:

[
    {'type': 'A', 'status': 'ok'},
    {'type': 'B', 'status': 'ok'},
    {'type': 'A', 'status': 'fail'}
]

我想将其转换为:

{
    'A': ['ok', 'fail'],
    'B': ['ok']
}

所以这当然是一个简单的任务,但我正在寻找 Pythonic 的方式来做到这一点,所以它会节省我几行代码

由于您的新结构也依赖于旧的(已处理的)键,我怀疑您是否可以使用字典理解(在每个键的基础上运行)来达到所需的最终状态。

我更愿意使用 defaultdict,其中每个默认键都是一个列表。

from collections import defaultdict
new_data = defaultdict(list)
for item in data:
    new_data[item['type']].append(item['status'])
print(new_data)

给出输出:

defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})

我不知道是否有单线,但您可以利用 setdefault or defaultdict 来达到预期的效果:

data = [
    {'type': 'A', 'status': 'ok'},
    {'type': 'B', 'status': 'ok'},
    {'type': 'A', 'status': 'fail'}
]

使用setdefault():

res = {}
for elt in data:
    res.setdefault(elt['type'], []).append(elt['status'])

输出:

{'A': ['ok', 'fail'], 'B': ['ok']}

使用defaultdict:

from collections import defaultdict
res = defaultdict(list)
for elt in data:
    res[elt['type']].append(elt['status'])

输出:

defaultdict(<class 'list'>, {'A': ['ok', 'fail'], 'B': ['ok']})

具有多个列表推导和 sorted(set(…)) 删除重复键的单行代码:

original = [
    {"type": "A", "status": "ok"},
    {"type": "B", "status": "ok"},
    {"type": "A", "status": "fail"},
]

result = {
    key: [x["status"] for x in original if x["type"] == key]
    for key in sorted(set([x["type"] for x in original]))
}

输出:

{'A': ['ok', 'fail'], 'B': ['ok']}