[英]Convert a list of objects to a dictionary of lists
我有一个 JSON 对象的列表,已经排序(比如说按时间)。 每个 JSON object 都有type
和status
。 例如:
[
{'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']})
我不知道是否有单线,但您可以使用setdefault
或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'])
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.