将对象列表转换为列表字典
Convert a list of objects to a dictionary of lists
我有一个 JSON 对象的列表,已经排序(比方说按时间排序)。每个 JSON 对象都有 type
和 status
。例如:
[
{'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']}
我有一个 JSON 对象的列表,已经排序(比方说按时间排序)。每个 JSON 对象都有 type
和 status
。例如:
[
{'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']}