代码之家  ›  专栏  ›  技术社区  ›  Ajay Misra

特定格式的Python字典输出列表

  •  0
  • Ajay Misra  · 技术社区  · 3 年前

    您好,我是python新手,这可能很小,但我发现如何获得特定格式的输出很困难。

    我有下面的目录被退回

    vpcs = [{'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-aaaaa'},
            {'ResourceOwnerId': '222222222222', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ccccc'}
            {'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ddddd'}]
    

    下面是我的脚本片段

    for vpc in vpcs:
            acc_data = {
                "account_number": vpc["ResourceOwnerId"],
                "vpc": [vpc['ResourceId']]
            }
            acc_list.append(acc_data)
    
    print(acc_list)
    

    其输出如下

            [
                {'account_number': '111111111111', 'vpc': ['vpc-aaaaa']},
                {'account_number': '222222222222', 'vpc': ['vpc-ccccc']},
                {'account_number': '111111111111', 'vpc': ['vpc-ddddd']}
            ]
    

    而我想要这样的输出

            [
                {'account_number': '111111111111', 'vpc': ['vpc-aaaaa', 'vpc-ddddd']},
                {'account_number': '222222222222', 'vpc': ['vpc-ccccc']}
            ]
    

    i、 e.“账号”与这些专有网络相同,因此应追加该账号,而不是创建新条目。任何帮助都将不胜感激谢谢

    4 回复  |  直到 3 年前
        1
  •  1
  •   Mark    3 年前

    你可以用 dict.setdefault 当第一次看到密钥时,创建一个空列表的基本子目录。然后再加上。最终结果将是 dict.values() :

    vpcs = [{'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-aaaaa'},
            {'ResourceOwnerId': '222222222222', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ccccc'},
            {'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ddddd'}]
    
    groups = {}
    
    for d in vpcs:
        k = d['ResourceOwnerId']
        groups.setdefault(k, {'account_number':k, 'vpc':[]} )['vpc'].append(d['ResourceId'])
        
    list(groups.values())
    

    这将给你:

    [{'account_number': '111111111111', 'vpc': ['vpc-aaaaa', 'vpc-ddddd']},
     {'account_number': '222222222222', 'vpc': ['vpc-ccccc']}]
    
        2
  •  1
  •   Tim Roberts    3 年前

    分两个阶段进行。使用字典建立唯一列表,然后转换为字典列表:

    from collections import defaultdict
    
    vpcs = [{'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-aaaaa'},
            {'ResourceOwnerId': '222222222222', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ccccc'},
            {'ResourceOwnerId': '111111111111', 'ResourceType': 'vpc', 'ResourceId': 'vpc-ddddd'}]
    
    accum = defaultdict(list)
    for vpc in vpcs:
        accum[vpc['ResourceOwnerId']].append( vpc['ResourceId'] )
    
    print(accum)
    
    acc_list = []
    for k, v in accum.items():
        acc_list.append(
            {
                "account_number": k,
                "vpc": v
            }
        )
    
    print(acc_list)
    

    输出:

    defaultdict(<class 'list'>, {'111111111111': ['vpc-aaaaa', 'vpc-ddddd'], '222222222222': ['vpc-ccccc']})
    [{'account_number': '111111111111', 'vpc': ['vpc-aaaaa', 'vpc-ddddd']}, {'account_number': '222222222222', 'vpc': ['vpc-ccccc']}]
    

    或者,对于那些喜欢一句台词的人:

    ...
    acc_list = [ { "account_number": k, "vpc": v } for k, v in accum.items()]
    print(acc_list)
    
        3
  •  1
  •   Codeman    3 年前
        from copy import deepcopy # create a copy of a list.
        # Your code snippet
        for vpc in vpcs:
            acc_data = {
                "account_number": vpc["ResourceOwnerId"],
                "vpc": [vpc['ResourceId']]
            }
            acc_list.append(acc_data)
    
        # Add this
        new_acc_list = deepcopy(acc_list)
        previous_acc_numbers = {} # int: index
    
        for acc_data in acc_list:
            acc_number, acc_vpc = acc_data.get(account_number), acc_data.get("vpc")
            if acc_number in previous_acc_numbers:
                new_acc_list[previous_acc_numbers.get(acc_number)].get("vpc").append(acc_data.get("vpc"))
        
        print(acc_list)
    
        4
  •  1
  •   not_speshal    3 年前

    尝试创建一个字典,将账号映射到VPC。然后转换这本字典:

    dct = dict()
    for vpc in vpcs:
        if vpc["ResourceOwnerId"] not in dct:
            dct[vpc["ResourceOwnerId"]] = list()
        dct[vpc["ResourceOwnerId"]].append(vpc["ResourceId"])
    
    output = [{"account_number": k, "vpc": v} for k,v in dct.items()]
    
    >>> output
    [{'account_number': '111111111111', 'vpc': ['vpc-aaaaa', 'vpc-ddddd']},
     {'account_number': '222222222222', 'vpc': ['vpc-ccccc']}]