社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Ajay Misra • 3 年前 • 1263 次点击  

您好,我是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.“账号”与这些专有网络相同,因此应追加该账号,而不是创建新条目。任何帮助都将不胜感激谢谢

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133357
 
1263 次点击  
文章 [ 4 ]  |  最新文章 3 年前
not_speshal
Reply   •   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']}]
Pranav
Reply   •   2 楼
Pranav    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)
Tim Roberts
Reply   •   3 楼
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)
Mark
Reply   •   4 楼
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']}]