用Python从不同字典的列表中创建字典

huangapple go评论86阅读模式
英文:

Python make dictionary from list of different dictionary

问题

我有以下字典列表:

  1. dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
  2. {'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
  3. {'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
  4. {'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
  5. {'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]

我想要从现有的字典列表中创建一个新的字典列表,如果在dict_list中有相同的"type",则将所有数据附加在一起,以创建如下所示的预期字典列表:

  1. expected_dict_list = [{'type':'hr', 'data':'[{"Name":"Name1","City":"city1","EMail":"email1@gmail.com"}, {"Name":"Name2","City":"city1","EMail":"email2@gmail.com"}]'},
  2. {'type':'it', 'data':'[{"Name":"Name3","City":"city3","EMail":"email3@gmail.com"},{"Name":"Name4","City":"city2","EMail":"email4@gmail.com"}]'},
  3. {'type':'op', 'data':'[{"Name":"Name5","City":"city1","EMail":"email5@gmail.com"}]'}]

请帮助实现这个预期输出,以便稍后基于"type"键将数据发布到相应类型的REST API端点。

英文:

I have the following list of dictionaries:

  1. dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
  2. {'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}',
  3. {'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
  4. {'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}',
  5. {'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:

  1. expacted_dict_list = [{'type':'hr', 'data':'[{"Name":"Name1","City":"city1","EMail":"email1@gmail.com"}, {"Name":"Name2","City":"city1","EMail":"email2@gmail.com"}]'},
  2. {'type':'it', 'data':'[{"Name":"Name3","City":"city3","EMail":"email3@gmail.com"},{"Name":"Name4","City":"city2","EMail":"email4@gmail.com"}]'},
  3. {'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

以下是您要的代码部分的翻译:

  1. from collections import defaultdict
  2. from pprint import pprint
  3. dict_list = [{'type': 'hr', 'data': {"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}},
  4. {'type': 'hr', 'data': {"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}},
  5. {'type': 'it', 'data': {"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}},
  6. {'type': 'it', 'data': {"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}},
  7. {'type': 'op', 'data': {"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}}]
  8. tempdict = defaultdict(list)
  9. for d in dict_list:
  10. tempdict[d['type']].append(d['data'])
  11. out_list = [{'type': k, 'data': v} for k,v in tempdict.items()]
  12. pprint(out_list)

输出:

  1. [{'data': [{'City': 'city1', 'EMail': 'email1@gmail.com', 'Name': 'Name1'},
  2. {'City': 'city1', 'EMail': 'email2@gmail.com', 'Name': 'Name2'}],
  3. 'type': 'hr'},
  4. {'data': [{'City': 'city3', 'EMail': 'email3@gmail.com', 'Name': 'Name3'},
  5. {'City': 'city2', 'EMail': 'email4@gmail.com', 'Name': 'Name4'}],
  6. 'type': 'it'},
  7. {'data': [{'City': 'city1', 'EMail': 'email5@gmail.com', 'Name': 'Name5'}],
  8. 'type': 'op'}]

如果您确认'data'参数周围的引号是错误的,并且它实际上应该是JSON字符串,那么您可以使用以下代码:

  1. import json
  2. tempdict = defaultdict(list)
  3. for d in dict_list:
  4. tempdict[d['type']].append(json.loads(d['data']))
  5. 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.

  1. from collections import defaultdict
  2. from pprint import pprint
  3. dict_list = [{'type': 'hr', 'data': {"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}},
  4. {'type': 'hr', 'data': {"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}},
  5. {'type': 'it', 'data': {"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}},
  6. {'type': 'it', 'data': {"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}},
  7. {'type': 'op', 'data': {"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}}]
  8. tempdict = defaultdict(list)
  9. for d in dict_list:
  10. tempdict[d['type']].append( d['data'] )
  11. out_list = [{'type': k, 'data': v} for k,v in tempdict.items()]
  12. pprint(out_list)

Output:

  1. [{'data': [{'City': 'city1', 'EMail': 'email1@gmail.com', 'Name': 'Name1'},
  2. {'City': 'city1', 'EMail': 'email2@gmail.com', 'Name': 'Name2'}],
  3. 'type': 'hr'},
  4. {'data': [{'City': 'city3', 'EMail': 'email3@gmail.com', 'Name': 'Name3'},
  5. {'City': 'city2', 'EMail': 'email4@gmail.com', 'Name': 'Name4'}],
  6. 'type': 'it'},
  7. {'data': [{'City': 'city1', 'EMail': 'email5@gmail.com', 'Name': 'Name5'}],
  8. '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:

  1. tempdict = defaultdict(list)
  2. for d in dict_list:
  3. tempdict[d['type']].append( json.loads(d['data']) )
  4. 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

我认为你的格式有一些错误(在第一个缺少 '},第二个多余 ')。
一旦修复,这应该可以运行:

  1. new_dict = dict()
  2. for d in dict_list:
  3. new_dict[d['type']] = new_dict.get(d['type'], []) + [d['data']]
  4. expacted_dict_list = [{'type': k, 'data': v} for k, v in new_dict.items()]

我将其用作输入:

  1. dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
  2. {'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
  3. {'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
  4. {'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
  5. {'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]

输出:

  1. [{'type': 'hr',
  2. 'data': ['{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
  3. '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}']},
  4. {'type': 'it',
  5. 'data': ['{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
  6. '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}']},
  7. {'type': 'op',
  8. '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:

  1. new_dict = dict()
  2. for d in dict_list:
  3. new_dict[d['type']] = new_dict.get(d['type'], []) + [d['data']]
  4. expacted_dict_list = [{'type': k, 'data': v} for k, v in new_dict.items()]

I'm using this as input:

  1. dict_list = [{'type': 'hr', 'data': '{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}'},
  2. {'type': 'hr', 'data': '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}'},
  3. {'type': 'it', 'data': '{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}'},
  4. {'type': 'it', 'data': '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}'},
  5. {'type': 'op', 'data': '{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}'}]

Output:

  1. [{'type': 'hr',
  2. 'data': ['{"Name": "Name1","City": "city1", "EMail": "email1@gmail.com"}',
  3. '{"Name": "Name2","City": "city1", "EMail": "email2@gmail.com"}']},
  4. {'type': 'it',
  5. 'data': ['{"Name": "Name3","City": "city3", "EMail": "email3@gmail.com"}',
  6. '{"Name": "Name4","City": "city2", "EMail": "email4@gmail.com"}']},
  7. {'type': 'op',
  8. 'data': ['{"Name": "Name5","City": "city1", "EMail": "email5@gmail.com"}']}]

huangapple
  • 本文由 发表于 2023年6月15日 02:29:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/76476566.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定