Проверьте, существует ли в словаре список как значение(по крайней мере с одним элементом), и верните его

#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