Я пытаюсь найти ключи словарей внутри словаря и записать их в набор, используя понимание набора/списка.

Вот так это выглядит:

dict_o_dicts = {
    1: {'de': 'eins', 'en': 'one' },
    2: {'de': 'zwei', 'en': 'two' },
    3: {'ru': 'три', 'gr': 'τρία' },
    0: {'ru': 'ноль' }}

Я могу заставить его работать, используя:

result = set()
for x in dict_o_dicts:
    for y in dict_o_dicts[x]:
        result.add(y)

Дает требуемый результат:

{'de', 'en', 'gr', 'ru'}

Но я должен решить это, используя понимание набора/списка. Я пробовал все, но всегда где-то застревал. Например:

result = [set(dict_o_dicts[x].keys()) for x in dict_o_dicts]

Он дает мне список наборов, но как я могу их объединить? Я просто не знаю, как решить это в одну строку.

3
goinginsane23 15 Янв 2022 в 19:18
Это ChainMap. set(ChainMap(*dict_o_dicts.values()))
 – 
Olvin Roght
15 Янв 2022 в 19:25
Должно ли все выражение быть пониманием или единственным требованием является то, что оно должно быть однострочным?
 – 
fluffyyboii
15 Янв 2022 в 19:25
Есть ли способ использовать только стандартную библиотеку?
 – 
goinginsane23
15 Янв 2022 в 19:26
Это должен быть только однострочный
 – 
goinginsane23
15 Янв 2022 в 19:26
@goinginsane23, collections.ChainMap является частью стандартная библиотека.
 – 
Olvin Roght
15 Янв 2022 в 19:27

4 ответа

Вот короткая попытка (это код гольфа? :p)

set().union(*dict_o_dicts.values())

Вывод: {'de', 'en', 'gr', 'ru'}

4
mozway 15 Янв 2022 в 19:38

Вы можете использовать двойные (или более) циклы for в наборе (или других) пониманиях:

>>> { k for sub_dict in dict_o_dicts.values() for k in sub_dict }
{'de', 'gr', 'ru', 'en'}
3
MrGeek 15 Янв 2022 в 19:29
1
Вы можете заменить синтаксис set() на {}, чтобы у вас было понимание вложенного множества. то, что он использует в настоящее время, выглядит как выражение gen и конструктор set(), что не идеально.
 – 
rv.kvetch
15 Янв 2022 в 19:29
1
@rv.kvetch Конечно, спасибо.
 – 
MrGeek
15 Янв 2022 в 19:30
Спасибо это то, что я искал
 – 
goinginsane23
15 Янв 2022 в 19:30
result = set()
[[result.add(y) for y in dict_o_dicts[x]] for x in dict_o_dicts]

Вы можете сделать что-то подобное.

Выход:

{'ru', 'gr', 'en', 'de'}
0
Bemwa Malak 15 Янв 2022 в 19:28

Чтобы сделать это с одноуровневым пониманием, вы можете использовать распаковку с помощью метода объединения набора:

set().union(*(v for v in dict_o_dicts.values()))

{'gr', 'ru', 'de', 'en'}

обратите внимание, что понимание в данном случае на самом деле не требуется

set().union(*dict_o_dicts.values())

{'gr', 'ru', 'de', 'en'}
0
Alain T. 15 Янв 2022 в 21:06