2

Невозможно превратить эти циклы в понимание словаря - это может быть невозможно.Понимание словаря Python с вложенным значением для

Основная идея заключается в том, что у меня есть словарь исключает, что выглядит следующим образом:

excludes = { 
    "thing1": ["name", "address"], 
    "thing2": ["username"] 
} 

Тогда у меня есть больший словарь, который я хочу «чистой» с помощью исключения

original_dict = { 
    "thing1": {"name": "John", "address": "123 Anywhere Drive", "occupation": "teacher" }, 
    "thing2": {"username": "bearsfan123", "joined_date": "01/01/2015"}, 
    "thing3": {"pet_name": "Spot"} 
} 

Если я запускаю следующее:

for k, v in original_dict.iteritems(): 
    if k in excludes.keys(): 
     for key in excludes[k]: 
      del v[key] 

Я оставил с:

original_dict = { 
    "thing1": {"occupation": "teacher" }, 
    "thing2": {"joined_date": "01/01/2015"}, 
    "thing3": {"pet_name": "Spot"} 
} 

Это прекрасно, но я не уверен, могу ли я лучше представить это как понимание словаря - просто добавляя ключи, которые я хочу, а не удаляю те, которые у меня нет.

Я получил вниз на второй for, но я не уверен, как представить, что в

new_dict = {k: v for (k, v) in original_dict.iteritems()} 

ответ

3
{k:{sub_k:val for sub_k, val in v.iteritems() 
    if sub_k not in excludes.get(k, {})} 
for k,v in original_dict.iteritems()} 

Примечание необходимость excludes.get(k, {}).

После вставки в ваших данных и запустить его в IPython:

In [154]: %cpaste 
Pasting code; enter '--' alone on the line to stop or use Ctrl-D. 
:{k:{sub_k:val for sub_k, val in v.iteritems() 
: if sub_k not in excludes.get(k, {})} 
: for k,v in original_dict.iteritems()} 
:-- 
Out[154]: 
{'thing1': {'occupation': 'teacher'}, 
'thing2': {'joined_date': '01/01/2015'}, 
'thing3': {'pet_name': 'Spot'}} 

Я лично утверждать, что для цикла подход является более читаемым и просто как правило, лучше и менее удивительным по всему спектру различных разработчика опыт работы с потенциальными читателями кода.

Небольшое изменение в циклю подхода, который не требует дурных побочных эффектов с del и использует внутреннее dict понимание:

new_dict = {} 
for k, v in original_dict.iteritems(): 
    k_excludes = excludes.get(k, {}) 
    new_dict[k] = {sub_k:sub_v for sub_k, sub_v in v.iteritems() 
        if sub_k not in k_excludes} 
+0

Это отлично, спасибо. Я думаю, что вы правы, хотя я должен был сначала задать вопрос «должен ли я сделать это в понимании». Мне нравится вариант на основе цикла for, но я могу использовать его вместо этого. – diplosaurus

 Смежные вопросы

  • Нет связанных вопросов^_^