предположим, что у вас есть список таких словарей:
{'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)
Это нормально, но для меня это пахнет не очень питоническим.
Вы бы поступили иначе? (более компактно?, другие способы сделать это?)
Спасибо
вы можете сократить последние три строки: dict_result = {**data_sub_dict,**rest_sub_dict}
Я бы не стал сосредотачиваться на написании максимально «сжатого» кода. Удобочитаемость гораздо ценнее, чем компактность кода. Вы бы предпочли отлаживать какую-то четко написанную функциональность или как можно больше логики, написанной всего одной строкой?
@ JLeno46 У меня такое впечатление, что код может быть намного лучше. не просто красивее.
@Марк. вуаля!!! это то, что я искал. идеально подходит для чтения. И идеально спрессован. Потому что это можно использовать и тогда, когда есть другие словари для «сложения».
Я бы предложил написать функцию, которая разбивает словарь на два, предоставляя при этом список ключей:
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
список, а не набор?
нисколько. на самом деле возможно поставить ее лучше. Я просто не сильный пользователь
В основном по привычке. Наборы, ориентированные на производительность, являются немного лучшим выбором, особенно в отношении дубликатов. У вас есть другая причина предпочесть набор?
Нет никаких причин, кроме того, что наборы специально разработаны, чтобы хорошо выполнять in
операции. Это дело Pythonic.
Почему update
s?
Можно написать все в одной инструкции, используя конструктор 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'}
Не должно быть лучше на codereview.stackexchange.com?