2013-12-15 1 views
0

При запуске следующего кода Python2.7 выдает NameError. Это происходит, когда вычисляется второй dict, paychecks. Первый dict, employees, в порядке.Как оценивать атрибут внутри вложенного понимания Python Dict

employees = { employee.ID:employee for employee in company.employees } 

paychecks = { 
    paycheck.ID:paycheck for paycheck in employee.paychecks 
    for key, employee in employees 
    } 

!!! NameError: global name 'employee' is not defined 

Является ли этот недопустимый Python или ошибка в моем коде? И что это лучший способ сделать это?

ответ

4

Вам необходимо указать свои петли в том же порядке, в котором вы их вложили; у вас есть заказ назад. Вам также необходимо использовать метод dict.items(), чтобы получить обе клавиши и значений. Это работает:

paychecks = {paycheck.ID: paycheck 
    for key, employee in employees.items() 
    for paycheck in employee.paychecks} 

как вам нужно сначала перебрать employees перед тем employee установлен.

Для списка, Словаря и набора постижений, фотографии петли как вложенные for заявления:

for key, employee in employees.items(): 
    for paycheck in employee.paychecks: 
     paychecks[paycheck.ID] = paycheck 

Если бы вы были гнездиться петлей в том порядке, указанных им, он должен немедленно быть ясно, почему вы получите NameError на employee:

for paycheck in employee.paychecks: 
    for key, employee in employees.items(): 
     paychecks[paycheck.ID] = paycheck 

Здесь внешний цикл пытается получить доступ к несуществующим employee объекта.

+0

Пятно на. Приветствия. –

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

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