python中的字典迭代

2024-05-16 03:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

users = [
    {'name': 'user1', 'role': ['Consumer']},
    {'name': 'user2', 'role': ['Developer', 'Support Engineer', 'Consumer']},
    {'name': 'user3', 'role': ['UX Designer', 'Architect']},
    {'name': 'user4', 'role': ['Architect']},
    {'name': 'user5', 'role': ['Consumer']}
]

我需要重复上面的列表并按如下方式打印: [{"role": "consumer", "users": ["user1", "user2"]}]

基本上颠倒了上面的列表,任何帮助都将不胜感激


Tags: namedevelopersupport列表consumerusersroledesigner
3条回答

您可以迭代users,构建一个中间字典,并将其转换为所需的json格式

from collections import defaultdict  

roles = defaultdict(list)
for user in users:
     roles[user["role"]].append(user["name"])

roles_json = [
     {"role": k, "users": v}
     for k, v in roles.items()
]

熊猫中可能有非常简单的轴翻转,但实现这一点的简单方法是:

users = [ ... ]  # your existing list
users_by_role = {}
for d in users:
    name, roles = d['name'], d['role']
    for role in roles:
        users_by_role.setdefault(role, []).append(name)

result = [{'role': role, 'users': users} for role, users in users_by_role.items()]

所以我认为这与印刷无关。您希望将用户列表转换为“角色”列表,例如:

def transform_to_role_list(users):
    roles_map = {}
    for user in users:
        for role in user['role']:
            if role in roles_map:
                roles_map[role].add(user['name'])
            else:
                roles_map[role] = {user['name']}
    return [{'role': role, 'users': list(user_set)} for role, user_set in roles_map.items()]

In [1]: transform_to_role_list(users)                                                                                                       
Out[1]: 
[{'role': 'Consumer', 'users': ['user2', 'user1', 'user5']},
 {'role': 'Developer', 'users': ['user2']},
 {'role': 'Support Engineer', 'users': ['user2']},
 {'role': 'UX Designer', 'users': ['user3']},
 {'role': 'Architect', 'users': ['user3', 'user4']}]

请注意,角色映射可能是对您更有用的表示形式(就像用户映射一样)

相关问题 更多 >