代码之家  ›  专栏  ›  技术社区  ›  user1511808

字典列表-如何组合字典列表

  •  -1
  • user1511808  · 技术社区  · 4 年前
    a =[{
        "id":"1",
        "Name":'BK',
        "Age":'56'
    },
    {
        "id":"1",
        "Sex":'Male'
    },
    {
        "id":"2",
        "Name":"AK",
        "Age":"32"
    }]
    

    我有一个字典列表,其中一个人的信息被拆分到多个字典中,如上所述,对于id 1以上的ex,其信息包含在前2个字典中,我如何获得下面的输出

    {1: {'Name':'BK','Age':'56','Sex':'Male'}, 2: { 'Name': 'AK','Age':'32'}}
    
    5 回复  |  直到 4 年前
        1
  •  0
  •   Richard Dodson    4 年前

    可以使用一些内置函数。groupby按id对字典进行分组,然后使用defaultdict收集结果。

    from itertools import groupby
    from collections import defaultdict
    
    a =[{ "id":"1", "Name":'BK', "Age":'56' }, { "id":"1", "Sex":'Male' }, { "id":"2", "Name":"AK", "Age":"32" }]
    
    results = defaultdict(dict)
    key = lambda d: d['id']
    for group_id, grouped in groupby(sorted(a, key=key), key=key):
        for d in grouped:
            d.pop('id')
            results[group_id].update(**d)
    

    这给了你:

    >>> results
    defaultdict(<type 'dict'>, {'1': {'Age': '56', 'Name': 'BK', 'Sex': 'Male'}, '2': {'Age': '32', 'Name': 'AK'}})
    

    defaultdict类型的行为与普通dict类似,只是当引用未知值时,会返回默认值。这意味着,正如《圣经》中的格言所说 a 迭代后,值(除 id )更新到现有dict或自动新建的dict上。

    How does collections.defaultdict work?

        2
  •  0
  •   sushanth    4 年前

    使用 defaultdict

    from collections import defaultdict
    
    a = [{
        "id": "1",
        "Name": 'BK',
        "Age": '56'
    },
        {
            "id": "1",
            "Sex": 'Male'
        },
        {
            "id": "2",
            "Name": "AK",
            "Age": "32"
        }
    ]
    
    final_ = defaultdict(dict)
    for row in a:
        final_[row.pop('id')].update(row)
    
    print(final_)
    

    defaultdict(<class 'dict'>, {'1': {'Name': 'BK', 'Age': '56', 'Sex': 'Male'}, '2': {'Name': 'AK', 'Age': '32'}})
    
        3
  •  0
  •   IamThuYa    4 年前

    您可以使用组合键组合两个词典。update()函数

    dict_a = { "id":"1", "Name":'BK', "Age":'56' }
    dict_b = { "id":"1", "Sex":'Male' }
    dict_a.update(dict_b) # {'Age': '56', 'Name': 'BK', 'Sex': 'Male', 'id': '1'}
    

    因为您想要的输出是字典形式的

    combined_dict = {}
    
    for item in a:
      id = item.pop("id")  # pop() remove the id key from item and return the value
      
      if id in combined_dict:
        combined_dict[id].update(item)
      else:
        combined_dict[id] = item
    
    print(combined_dict)  # {'1': {'Name': 'BK', 'Age': '56', 'Sex': 'Male'}, '2': {'Name': 'AK', 'Age': '32'}}
    
        4
  •  0
  •   BIlguun Zorigt    4 年前
    from collections import defaultdict
    result = defaultdict(dict)
        
    a =[{ "id":"1", "Name":'BK', "Age":'56' }, { "id":"1", "Sex":'Male' }, { "id":"2", "Name":"AK", "Age":"32" }]
    
    for b in a:
      result[b['id']].update(b)
    
    print(result)
    
        5
  •  0
  •   Lee    4 年前
    d = {}
    for p in a:
        id = p["id"]
        if id not in d.keys():
            d[id] = p
        else:
            d[id] = {**d[id], **p}
    
    推荐文章