2013-07-15 40 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()将返回第一个产生的结果。