Python вложенное понимание слова - PullRequest
3 голосов
/ 09 января 2011

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

>> j = dict(((x+y,0) for x in 'cd') for y in 'ab')
>> {('ca', 0): ('da', 0), ('cb', 0): ('db', 0)}

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

>> j
>> {'ca':0, 'cb':0, 'da':0, 'db':0}

Спасибо!

Ответы [ 4 ]

8 голосов
/ 09 января 2011
dict((x+y,0) for x in 'cd' for y in 'ab')
4 голосов
/ 09 января 2011

Вы можете упростить это до одного цикла, используя декартово произведение от itertools

>>> from itertools import product
>>> j=dict((x+y,0) for x,y in product('cd','ab'))
>>> j
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
>>> 
1 голос
/ 09 января 2012

Дополнительные круглые скобки в вопросе вводят другое выражение генератора, которое дает 2 генератора, каждый из которых дает 2 кортежа.Понимание списка ниже точно показывает, что происходит.

>>> [w for w in (((x+y,0) for x in 'cd') for y in 'ab')]
[<generator object <genexpr> at 0x1ca5d70>, <generator object <genexpr> at 0x1ca5b90>]

Понимание списка вместо выражения генератора показывает, что содержат генераторы выше

>>> [w for w in ([(x+y,0) for x in 'cd'] for y in 'ab')]
[[('ca', 0), ('da', 0)], [('cb', 0), ('db', 0)]]

И именно поэтому вы получили дваключ-значение пар кортежей.

Почему работает ответ Муада

>>> [w for w in ((x+y,0) for x in 'cd' for y in 'ab')]
[('ca', 0), ('cb', 0), ('da', 0), ('db', 0)]

В Python 2.7 и 3.0 и выше, вы можете использовать dict-понимания

>>> j = {x+y:0 for x in 'cd' for y in 'ab'}
>>> j
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
1 голос
/ 09 января 2011
dict((x+2*y, 0) for x in range(1,4,2) for y in range(15, 18, 2))

Кстати, то, что мы называем пониманием слова, - это нечто вроде следующего, доступного только в Python2.7 +:

{x+2*y:0 for x in range(1,4,2) for y in range(15, 18, 2)}
...