итерация словаря в python - PullRequest
       5

итерация словаря в python

0 голосов
/ 28 апреля 2020
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"]}]

В основном переверните приведенный выше список, любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

Вы можете выполнить итерацию по своему 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()
]
1 голос
/ 28 апреля 2020

Так что я думаю, что это не о печати. Вы хотите преобразовать свой список пользователей в список «ролей», например:

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']}]

Обратите внимание, что role_map, вероятно, является более полезным представлением для вас (как и карта пользователей)

1 голос
/ 28 апреля 2020

Вероятно, в pandas есть, по-настоящему, простые переключения осей, но простой способ сделать это:

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()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...