Развернуть словарь Python эффективным способом

предположим, что у вас есть список таких словарей:

{'id':1,
'station': 'LYO',
'country': 'France',
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}

Я хотел бы создать:

{'data':{'id':1,
        'station': 'LYO',
        'country': 'France'},
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}

в основном включают в подсловарь данных ключи-значения data_items= ['id','station','country']

очевидный длинный способ сделать это:

data_keys = ['id','station']
data_sub_dict = {'data':{el:node[el] for el in data_keys}}
rest_sub_dict = {el:node[el] for el in node.keys() if el not in data_keys}
dict_result  = {}
dict_result.update(data_sub_dict)
dict_result.update(rest_sub_dict)

Это нормально, но для меня это пахнет не очень питоническим.

Вы бы поступили иначе? (более компактно?, другие способы сделать это?)

Спасибо

Не должно быть лучше на codereview.stackexchange.com?

JLeno46 12.12.2020 20:12

вы можете сократить последние три строки: dict_result = {**data_sub_dict,**rest_sub_dict}

Marc 12.12.2020 20:28

Я бы не стал сосредотачиваться на написании максимально «сжатого» кода. Удобочитаемость гораздо ценнее, чем компактность кода. Вы бы предпочли отлаживать какую-то четко написанную функциональность или как можно больше логики, написанной всего одной строкой?

CCBet 12.12.2020 20:31

@ JLeno46 У меня такое впечатление, что код может быть намного лучше. не просто красивее.

JFerro 12.12.2020 20:35

@Марк. вуаля!!! это то, что я искал. идеально подходит для чтения. И идеально спрессован. Потому что это можно использовать и тогда, когда есть другие словари для «сложения».

JFerro 12.12.2020 20:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы предложил написать функцию, которая разбивает словарь на два, предоставляя при этом список ключей:

def filterByKeys(d,keys):
    a = {}; b = {};
    for k in d:
        if k in keys: a[k] = d[k]
        else :        b[k] = d[k]
    return (a,b)
    
d1, d2 = filterByKeys(d,['id','station'])
{'data':d1,**d2}

Хотя этот подход не использует понимание списка для повторения словаря, он становится очень простым для понимания.

По какой причине вы передаете keys список, а не набор?

Mark Ransom 12.12.2020 20:49

нисколько. на самом деле возможно поставить ее лучше. Я просто не сильный пользователь

JFerro 12.12.2020 20:57

В основном по привычке. Наборы, ориентированные на производительность, являются немного лучшим выбором, особенно в отношении дубликатов. У вас есть другая причина предпочесть набор?

Marc 12.12.2020 20:58

Нет никаких причин, кроме того, что наборы специально разработаны, чтобы хорошо выполнять in операции. Это дело Pythonic.

Mark Ransom 15.12.2020 04:42
Ответ принят как подходящий

Почему updates?

Можно написать все в одной инструкции, используя конструктор dict:

data = {'id':1,
'station': 'LYO',
'country': 'France',
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':'yes'}


dict(
    {'data': {k:v for k,v in data.items() if k in ('id', 'station','country')}},
    **{k:v for k,v in data.items() if k in ('classes', 'color', 'population', 'university')})

Результат:

{'data': {'id': 1, 'station': 'LYO', 'country': 'France'},
 'classes': 'EU',
 'color': 'orange',
 'population': 100000,
 'university': 'yes'}

Другие вопросы по теме