#python #dictionary
#питон #словарь
Вопрос:
У меня есть следующий словарь:
dict1 = {'Diacto Group': {'id': 7547, 'type': 'user', 'name': 'Diacto Group', 'filters': [{'column': 'Core Area', 'values': ['Missiles amp; Aviation Technology'], 'operator': 'EQUALS', 'not': False}], 'users': [], 'virtualUsers': [], 'groups': [360305499]}, 'Diacto People': {'id': 7548, 'type': 'user', 'name': 'Diacto People', 'filters': [{'column': 'Core Area', 'values': ['Aircraft Company', 'Aviation Technology'], 'operator': 'EQUALS', 'not': False}], 'users': [326197441, 1293859642], 'virtualUsers': [], 'groups': []}, }
В принципе, я хочу извлечь один из списков из «пользователей» или «групп», если у них есть список, содержащий по крайней мере одно значение. Я хочу, чтобы конечный результат выглядел так:
l1 = [# Extracted list as value from 'group' key from Diacto Group key as users key was blank # list. [360305499], # Extracted list as value from 'users' key from Diacto People key as groups key was # blank list. [326197441, 1293859642] ]
Понимание списка было бы более предпочтительным, если это возможно. Спасибо вам за усилия и время, которые вы вложили в это.
Комментарии:
1. гарантируется ли, что либо
users
одно, либоgroups
заполнено, что другое пустое?2. Пожалуйста, опубликуйте код, который вы пробовали, и кратко объясните, в чем заключается ваша проблема.
3. @gold_cy да, любой из них гарантированно будет пустым, но учтите возможность того, что оба они не пусты, чтобы сделать ваш ответ более полезным.
Ответ №1:
Самое простое, что я могу придумать с пониманием, при условии, что ни «пользователи», ни «группы» не пусты:
[v['users'] v['groups'] for v in dict1.values()]
Комментарии:
1. Это наилучший подход
2. @Aztec-3×5 — Обратите внимание, что ваши выходные данные будут содержать пустые списки, если и «пользователи», и «группы» пусты. Вам нужно
if
условие, чтобы отфильтровать их.3. @not_speshal прав. также оба будут объединены, если не пусты (вы не указали поведение в этом случае).
4. Согласен с @not_speshal.
Ответ №2:
Я думаю, что это можно было бы сделать с пониманием списка, но чрезвычайно трудно понять.
Это был бы мой подход:
l1 = [] for k in dict1: if len(dict1[k]['users']) gt; 0: l1.append(dict1[k]['users']) if len(dict1[k]['groups']) gt; 0: l1.append(dict1[k]['groups']) print(l1)
Ответ №3:
Использование понимания списка и фильтрация случаев, когда как «пользователи», так и «группы» пусты:
l1 = [v["users"] v["groups"] for _, v in dict1.items() if v["users"] v["groups"]]
Комментарии:
1. Мне тоже понравился твой ответ, @not_speshal