繁体   English   中英

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

[英]Convert a list of objects to a dictionary of lists

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

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

我想将其转换为:

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

所以当然这是一个简单的任务,但我正在寻找 Pythonic 的方式来做这件事,所以它可以让我省去几行代码

由于您的新结构还依赖于较旧的(已处理的)键,我怀疑您是否可以使用字典理解(基于每个键操作)来实现所需的最终 state。

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

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

这给出了 output:

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

我不知道是否有单线,但您可以使用setdefaultdefaultdict来实现所需的结果:

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

Output:

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

使用defaultdict

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

Output:

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

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM