Python: цикл по одному словарю и создание пар ключ / значение в новом словаре, если выполняются условия - PullRequest
4 голосов
/ 02 июля 2010

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

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

edit: извините за все возвраты, но переполнение стека не распознает одиночные возвраты и запускает 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] = {} в каждом из блоков for (строки 7 и 11)и просто поместите один перед оператором '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 ]

3 голосов
/ 02 июля 2010

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

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

    if ... other etc etc ...

На самом деле простейшим может быть использование «диктов по умолчанию» вместо простых:

import collections
jobs_in_school_district = collections.defaultdict(dict)

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

0 голосов
/ 02 июля 2010

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

school_districts = {0: {'needs':  'superintendent', 'grades': 'K-12'}, 
                    1:{'needs': 'social_studies', 'grades': 'K-12'}}
0 голосов
/ 02 июля 2010

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

jobs_in_school_district[key] = {}

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

И да, форматирование невозможно прочитать.

...