Python: переключение на один словарь и создание пар ключ / значение в новом словаре, если условия встречаются

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

Вот надуманный пример, который показывает мою проблему.

Правка: извините за все возвраты, но переполнение стека не распознает одиночные возвращения и работает на 3-4 строки на одну строку, делая код неразборчивым. Кроме того, он не выделяет мой код как код. не знаю почему.

employee = {'skills': 'superintendent', 'teaches': 'social studies', 'grades': 'K-12'} school_districts = {0: {'needs': 'superintendent', 'grades': 'K-12'}, 1:{'needs': 'social_studies', 'grades': 'K-12'}} jobs_in_school_district = {} for key in school_districts: if (employee['skills'] == school_districts[key]['needs']): jobs_in_school_district[key] = {} jobs_in_school_district[key]['best_paying_job'] = 'superintendent' if (employee['teaches'] == school_districts[key]['needs']): jobs_in_school_district[key] = {} jobs_in_school_district[key]['other_job'] = 'social_studies_teacher' print(jobs_in_school_district) 

Это значение, которое я хочу увидеть для «jobs_in_school_district»:

 {0: {'best_paying_job': 'superintendent'}, 1: {'other_job': 'social_studies_teacher'}} 

Это то, что я получаю:

 {1: {'other_job': 'social_studies_teacher'}} 

Я понимаю, что здесь не так. Python устанавливает jobs_in_school_district равным {0: {'best_paying_job': 'superintendent'} после первого блока if (строки 6-8). Затем он выполняет второй блок if (строка 10). Но затем он перезаписывает {0: {'best_paying_job': 'superintendent'} в строке 11 и снова создает пустой dict. Затем он назначает 1: {'other_job': 'social_studies_teacher'} ' jobs_in_school_district в строке 12.

Но если я jobs_in_school_district[key] = {} два jobs_in_school_district[key] = {} в каждом из блоков (строки 7 и 11) и просто поставлю один перед оператором for for (новая строка 5) следующим образом:

 jobs_in_school_district[key] = {} for key in school_districts: if (employee['skills'] == school_districts[key]['needs']): jobs_in_school_district[key]['best_paying_job'] = 'superintendent' if (employee['teaches'] == jobs[key]['needs']): jobs_in_school_district[key]['other_job'] = 'social_studies_teacher' print(jobs_in_school_district) 

Он проверяет только первый ключ в типе «school_districts», а затем останавливается (он прекращает цикл, я думаю, я не знаю), поэтому я получаю следующее:

 jobs_in_school_district = {0: {'best_paying_job': 'superintendent'} 

(Я пытался переписать его несколько раз, и иногда я получаю «ключевую ошибку»).

Первый вопрос: почему не работает этот второй блок кода? Второй вопрос: как написать код, чтобы он работал?

(Я не понимаю «следующий» (метод или функцию) и что он делает, поэтому, если я должен использовать его, не могли бы вы объяснить? Спасибо).

3 Solutions collect form web for “Python: переключение на один словарь и создание пар ключ / значение в новом словаре, если условия встречаются”

Простейшее исправление (и ответ на ваш первый вопрос): key не определен правильно в ваших последних фрагментах, назначение должно быть внутри поля if for исключением if :

 for key in school_districts: jobs_in_school_district[key] = {} if ... etc etc ... if ... other etc etc ... 

Фактически, проще всего использовать «default dicts» вместо простых:

 import collections jobs_in_school_district = collections.defaultdict(dict) 

Теперь вы можете удалить присвоение индексированию [key] и это будет сделано для вас автоматически, если и когда это необходимо в первый раз для любого заданного ключа.

Попробуйте разместить

 jobs_in_school_district[key] = {} 

после цикла for, но перед операторами if.

И да, форматирование не читается.

Если вы меняете social_studies на социальные исследования без подчеркивания, код работает так, как вы ожидали. См. Эту строку:

 school_districts = {0: {'needs': 'superintendent', 'grades': 'K-12'}, 1:{'needs': 'social_studies', 'grades': 'K-12'}} 
Python - лучший язык программирования в мире.