2013-07-15 4 views
0

Я хотел бы искать в г, ниже фрагмент кода возврата правильного результата, т.е. 3. Однако, как можно написать код, приведенный ниже в выражение генератора?Улучшение кода с выражением генератора

a = [4, 6] 
d= {0: [0, 4], 1: [3, 6], 2: [4, 0], 3: [4, 6], 4: [6, 3], 5: [6, 4]} 

for i in range(0, len(d)): 
    if d.get(i) == a: 
     print i 

ответ

1

Итерация по пунктам:

>>> a = [4, 6] 
>>> for k, v in d.iteritems(): 
...  if v == a: 
...    print k 
... 
3 

d.iteritems() возвращает генератор каждого элемента в словаре с их ключом и значением:

>>> list(d.iteritems()) 
[(0, [0, 4]), (1, [3, 6]), (2, [4, 0]), (3, [4, 6]), (4, [6, 3]), (5, [6, 4])] 

Если вы работаете с Python 3, items() является идентичны итерам.

2

Вам не нужен диапазон.

>>> a = [4, 6] 
>>> d = {0: [0, 4], 1: [3, 6], 2: [4, 0], 3: [4, 6], 4: [6, 3], 5: [6, 4]} 
>>> [i for i in d if d[i] == a] 
[3] 
>>> (i for i in d if d[i] == a) 
<generator object <genexpr> at 0x7f14d9629690> 
>>> next(_) 
3 
+0

У этого есть преимущество в работе Python2 и Python3 –

+1

Почему 'd.get', если вы знаете, что ключ уже есть? – Blender

+0

d.get() имеет возможность вернуть «Нет», если вы укажете неверный, недействительный или иначе несуществующий ключ. Кроме того, вы рискуете бросить «KeyError», если вы попытаетесь «d [key]»; это хорошая практика ИМО. –

1

С next():

next(k for k, v in d.iteritems() if v == a) 

next() возвратит первый результат, выданный.

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