我有以下字典列表:
[
{"id": 1, "roll_id": ["101", "201"]},
{"id": 2, "roll_id": ["301", "201"]},
{"id": 3, "roll_id": ["424"]}
]
现在我需要将其转换为以下格式:
[
{'roll_id': '101', 'id':["1"]},
{'roll_id': '201', 'id':["1","2"]},
{'roll_id': '301', 'id':["2"]},
{'roll_id': '424', 'id':["3"]}
]
有人能帮我吗?
您可以使用字典+setdefault
来收集值,然后转换为列表:
out = {}
for d in l:
for RID in d['roll_id']:
out.setdefault(RID, {'roll_id': RID, 'id': []})['id'].append(d['id'])
out = list(out.values())
另一个使用熊猫的解决方案:
l = [
{"id": 1, "roll_id": ["101", "201"]},
{"id": 2, "roll_id": ["301", "201"]},
{"id": 3, "roll_id": ["424"]}
]
import pandas as pd
out = (pd
.json_normalize(l)
.explode('roll_id')
.groupby('roll_id', as_index=False)
['id'].agg(list)
.to_dict('records')
)
输出:
[{'roll_id': '101', 'id': [1]},
{'roll_id': '201', 'id': [1, 2]},
{'roll_id': '301', 'id': [2]},
{'roll_id': '424', 'id': [3]}]
试试这个:
data = [{"id": 1, "roll_id": ["101", "201"]}, {"id": 2, "roll_id": ["301", "201"]}, {"id": 3, "roll_id": ["424"]}]
res = []
for el in data:
for r in el["roll_id"]:
find = [i for i, v in enumerate(res) if v['roll_id'] == r]
if not find:
res.append({'roll_id': r, "id": [el['id']]})
else:
res[find[0]]['id'].append(el['id'])['id'].append(el['id'])
print(res)
结果:
[{'roll_id': '101', 'id': [1]}, {'roll_id': '201', 'id': [1, 2]}, {'roll_id': '301', 'id': [2]}, {'roll_id': '424', 'id': [3]}]
不是我最好的,但它很管用。
问候,
我认为最有效的方法可能是这样的:
def convert(input_dict):
result = {}
for dic in input_dict:
for roll_id in dic["roll_id"]:
str_id = str(dic["id"])
if roll_id in result:
result[roll_id]["id"].append(str_id)
else:
result[roll_id] = {"roll_id":roll_id, "id":[str_id]}
return [result[i] for i in result]
print(convert(test))