2013-07-15 70 views
0

代碼,我想搜索一個d,代碼返回正確的結果低於大塊,即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

迭代通過項目:

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

如果你使用Python 3個工作,items()是:

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

d.iteritems()與他們的鍵和值的字典返回每個項目的生成與iteritems相同。

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()具有返回'None'的好處。或者,如果嘗試使用'd [key]',則冒着拋出'KeyError'的風險;這是IMO的良好做法。 –

1

隨着next()

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

next()將返回第一個產生的結果。