微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将子字段的字典合并到一个字典中

如何解决将子字段的字典合并到一个字典中

想象一下,我有以下字典,对于每条记录(数据行),我想将子字段的字典合并为一个字典。所以最后我有一个字典列表。每条记录一个

Data = [{'Name': 'bob','age': '40’}
        {'Name': 'tom','age': '30’},{'Country’: 'US','City': ‘Boston’},'City': ‘New York},{'Email’: 'bob@fake.com','Phone': ‘bob phone'},{'Email’: 'tom@fake.com','Phone': ‘none'}]
               
Output = [
{'Name': 'bob','age': '40’,'Country’: 'US','City': ‘Boston’,'Email’: 'bob@fake.com',{'Name': 'tom','age': '30’,'City': ‘New York','Email’: 'tom@fake.com','Phone': ‘none'}
]

解决方法

相关:How do I merge a list of dicts into a single dict?

我知道您知道哪本词典与Bob相关,而哪本词典与Tom有关,按其位置:偶数位置的词典与Bob相关,而奇数位置的词典与Tom相关。

您可以使用% 2检查数字是奇数还是偶数:

Data = [{'Name': 'bob','age': '40'},{'Name': 'tom','age': '30'},{'Country': 'US','City': 'Boston'},'City': 'New York'},{'Email': 'bob@fake.com','Phone': 'bob phone'},{'Email': 'tom@fake.com','Phone': 'none'}]
bob_dict = {}
tom_dict = {}
for i,d in enumerate(Data):
  if i % 2 == 0:
    bob_dict.update(d)
  else:
    tom_dict.update(d)
Output=[bob_dict,tom_dict]

或者:

Output = [{},{}]
for i,d in enumerate(Data):
  Output[i%2].update(d)

第二种方法不仅编写时间短,而且如果有两个以上的人,则执行更快,则更容易扩展。

将列表分为两个以上的词典

k = 4 # number of dictionaries you want
Data = [{'Name': 'Alice',{'Name': 'Bob',{'Name': 'Charlie',{'Name': 'Diane',{'Country': 'UK','City': 'London'},'City': 'Oxford'},{'Email': 'alice@fake.com','Phone': 'alice phone'},'Phone': '12345'},{'Email': 'charlie@fake.com','Phone': '0000000'},{'Email': 'diane@fake.com','Phone': 'none'}]
Output = [{} for j in range(k)]
for i,d in enumerate(Data):
  Output[i%k].update(d)

# Output = [
#  {'Name': 'Alice','age': '40','Country': 'US','City': 'Boston','Email': 'alice@fake.com',#  {'Name': 'Bob','age': '30','City': 'New York','Email': 'bob@fake.com',#  {'Name': 'Charlie','Country': 'UK','City': 'London','Email': 'charlie@fake.com',#  {'Name': 'Diane','City': 'Oxford','Email': 'diane@fake.com','Phone': 'none'}
#]

另外,而不是硬编码k = 4

  • 如果您知道字段数但不知道人数,则可以通过将字典的初始数量除以字典类型的数量来计算k
fields = ['Name','Country','Email']
assert(len(Data) % len(fields) == 0)    # make sure Data is consistent with number of fields
k = len(Data) // len(fields)
  • 或者,您也可以通过计算k字段中出现的次数来计算'Names'
k = sum(1 for d in Data if 'Name' in d)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。