Понимание вложенного словаря Python с наборами

Может кто-нибудь объяснить, как делать вложенные понимания dict?

>> l = [set([1, 2, 3]), set([4, 5, 6])]
>> j = dict((a, i) for a in s for i, s in enumerate(l))
>> NameError: name 's' is not defined

Мне бы хотелось:

>> j
>> {1:0, 2:0, 3:0, 4: 1, 5: 1, 6: 1}

Я только что задал предыдущий вопрос о более простом понимании dict, где скобки в функции генератора были уменьшены . Почему s в крайнем левом понимании не распознается?


person atp    schedule 09.01.2011    source источник


Ответы (1)


Просто измените порядок двух петель:

j = dict((a, i) for i, s in enumerate(l) for a in s)
person satoru    schedule 09.01.2011
comment
Это работает. Однако я прочитал в руководстве (docs.python.org/tutorial/datastructures.html ), что особое внимание следует уделить пониманию вложенного списка: чтобы избежать опасений при включении вложенных списков, читайте справа налево. Почему это не применимо? - person atp; 09.01.2011
comment
@Jasie Потому что то, что мы здесь делаем, не является пониманием вложенного списка. Понимание вложенного списка похоже на [ [i*j for j in range(3)] for i in range(3)]. Инструмент, который мы здесь используем, — это вовсе не понимание списка, это выражение генератора. - person satoru; 09.01.2011
comment
Из PEP 202 (python.org/dev/peps/pep-0202 ), согласно BDFL: The form [... for x... for y...] nests, with the last index varying fastest, just like nested for loops. Дело не в том, какой тип выражения мы используем, а в синтаксисе вложенного цикла понимания списка. - person Katriel; 09.01.2011
comment
Понятно, спасибо за объяснение + ссылку, @Satoru.Logic и @katriealex. - person atp; 09.01.2011