英文:
Python make dictionary from list of different dictionary
问题
我有以下字典列表:
dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
{'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
{'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]
我想要从现有的字典列表中创建一个新的字典列表,如果在dict_list中有相同的"type",则将所有数据附加在一起,以创建如下所示的预期字典列表:
expected_dict_list = [{'type':'hr', 'data':'[{"Name":"Name1","City":"city1","EMail":"email1@gmail.com"}, {"Name":"Name2","City":"city1","EMail":"email2@gmail.com"}]'},
{'type':'it', 'data':'[{"Name":"Name3","City":"city3","EMail":"email3@gmail.com"},{"Name":"Name4","City":"city2","EMail":"email4@gmail.com"}]'},
{'type':'op', 'data':'[{"Name":"Name5","City":"city1","EMail":"email5@gmail.com"}]'}]
请帮助实现这个预期输出,以便稍后基于"type"键将数据发布到相应类型的REST API端点。
英文:
I have the following list of dictionaries:
dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
{'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}',
{'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
{'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}',
{'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}']
I would like to create new list of dictionaries from the existing list of dictionaries where If I have the same "type" in dict_list then append all data to make a single list of data dictionary as below expected list of dictionary:
expacted_dict_list = [{'type':'hr', 'data':'[{"Name":"Name1","City":"city1","EMail":"email1@gmail.com"}, {"Name":"Name2","City":"city1","EMail":"email2@gmail.com"}]'},
{'type':'it', 'data':'[{"Name":"Name3","City":"city3","EMail":"email3@gmail.com"},{"Name":"Name4","City":"city2","EMail":"email4@gmail.com"}]'},
{'type':'op', 'data':'[{"Name":"Name5","City":"city1","EMail":"email5@gmail.com"}]'}]
Please help to achieve any this expected output.so that later based on key type will post the data to a rest api endpoints for that type.
答案1
得分: 1
以下是您要的代码部分的翻译:
from collections import defaultdict
from pprint import pprint
dict_list = [{'type': 'hr', 'data': {"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}},
{'type': 'hr', 'data': {"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}},
{'type': 'it', 'data': {"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}},
{'type': 'it', 'data': {"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}},
{'type': 'op', 'data': {"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}}]
tempdict = defaultdict(list)
for d in dict_list:
tempdict[d['type']].append(d['data'])
out_list = [{'type': k, 'data': v} for k,v in tempdict.items()]
pprint(out_list)
输出:
[{'data': [{'City': 'city1', 'EMail': 'email1@gmail.com', 'Name': 'Name1'},
{'City': 'city1', 'EMail': 'email2@gmail.com', 'Name': 'Name2'}],
'type': 'hr'},
{'data': [{'City': 'city3', 'EMail': 'email3@gmail.com', 'Name': 'Name3'},
{'City': 'city2', 'EMail': 'email4@gmail.com', 'Name': 'Name4'}],
'type': 'it'},
{'data': [{'City': 'city1', 'EMail': 'email5@gmail.com', 'Name': 'Name5'}],
'type': 'op'}]
如果您确认'data'
参数周围的引号是错误的,并且它实际上应该是JSON字符串,那么您可以使用以下代码:
import json
tempdict = defaultdict(list)
for d in dict_list:
tempdict[d['type']].append(json.loads(d['data']))
out_list = [{'type': k, 'data': json.dumps(v)} for k,v in tempdict.items()]
但请确保再次验证数据格式。将JSON嵌套在JSON中是不常见的,但也不是不可能的情况。
英文:
This does what you ask in a few lines.
from collections import defaultdict
from pprint import pprint
dict_list = [{'type': 'hr', 'data': {"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}},
{'type': 'hr', 'data': {"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}},
{'type': 'it', 'data': {"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}},
{'type': 'it', 'data': {"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}},
{'type': 'op', 'data': {"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}}]
tempdict = defaultdict(list)
for d in dict_list:
tempdict[d['type']].append( d['data'] )
out_list = [{'type': k, 'data': v} for k,v in tempdict.items()]
pprint(out_list)
Output:
[{'data': [{'City': 'city1', 'EMail': 'email1@gmail.com', 'Name': 'Name1'},
{'City': 'city1', 'EMail': 'email2@gmail.com', 'Name': 'Name2'}],
'type': 'hr'},
{'data': [{'City': 'city3', 'EMail': 'email3@gmail.com', 'Name': 'Name3'},
{'City': 'city2', 'EMail': 'email4@gmail.com', 'Name': 'Name4'}],
'type': 'it'},
{'data': [{'City': 'city1', 'EMail': 'email5@gmail.com', 'Name': 'Name5'}],
'type': 'op'}]
This ASSUMES that the quotes around your 'data' parameter were a mistake. (You also omitted a closing ]
on each line -- you should always run the code before you paste it into a question). IF the 'data'
member is actually supposed to be a JSON string, then you'd need an extra json.loads
step in the first loop, and an extra json.dumps
in the second loop.
Followup
If my assumptions were wrong, then you need:
tempdict = defaultdict(list)
for d in dict_list:
tempdict[d['type']].append( json.loads(d['data']) )
out_list = [{'type': k, 'data': json.dumps(v)} for k,v in tempdict.items()]
But certainly do double check this. It's unusual (but not unheard of) to have JSON nested inside JSON.
答案2
得分: 0
我认为你的格式有一些错误(在第一个缺少 '
和 }
,第二个多余 '
)。
一旦修复,这应该可以运行:
new_dict = dict()
for d in dict_list:
new_dict[d['type']] = new_dict.get(d['type'], []) + [d['data']]
expacted_dict_list = [{'type': k, 'data': v} for k, v in new_dict.items()]
我将其用作输入:
dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
{'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
{'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]
输出:
[{'type': 'hr',
'data': ['{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
'{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}']},
{'type': 'it',
'data': ['{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
'{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}']},
{'type': 'op',
'data': ['{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}']}]
英文:
I think you have some errors in your formatting (missing '
and }
in the 1st, extra '
in the second.
Once fixed, this should work:
new_dict = dict()
for d in dict_list:
new_dict[d['type']] = new_dict.get(d['type'], []) + [d['data']]
expacted_dict_list = [{'type': k, 'data': v} for k, v in new_dict.items()]
I'm using this as input:
dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
{'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
{'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
{'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]
Output:
[{'type': 'hr',
'data': ['{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
'{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}']},
{'type': 'it',
'data': ['{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
'{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}']},
{'type': 'op',
'data': ['{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}']}]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论