<p>两个答案都是好的,格雷格是对的,雷蒙德的答案更高层次,更容易实现,但我基于格雷格的答案,因为它更容易操作,以满足我的需要。</p>
<p>以防有人正在寻找一种方法,从一个dict列表中找到n个最接近的值。</p>
<p>我的dict是这样的,其中npi只是一个标识符,我需要它和值一起:</p>
<pre><code>mydict = {u'fnpi': u'1982650024',
u'snpi': {u'npi': u'1932190360', u'value': 2672},
u'snpis': [{u'npi': u'1831289255', u'value': 20},
{u'npi': u'1831139799', u'value': 20},
{u'npi': u'1386686137', u'value': 37},
{u'npi': u'1457355257', u'value': 45},
{u'npi': u'1427043645', u'value': 53},
{u'npi': u'1477548675', u'value': 53},
{u'npi': u'1851351514', u'value': 57},
{u'npi': u'1366446171', u'value': 60},
{u'npi': u'1568460640', u'value': 75},
{u'npi': u'1326046673', u'value': 109},
{u'npi': u'1548281124', u'value': 196},
{u'npi': u'1912989989', u'value': 232},
{u'npi': u'1336147685', u'value': 284},
{u'npi': u'1801894142', u'value': 497},
{u'npi': u'1538182779', u'value': 995},
{u'npi': u'1932190360', u'value': 2672},
{u'npi': u'1114020336', u'value': 3264}]}
value = mydict['snpi']['value'] #value i'm working with below
npi = mydict['snpi']['npi'] #npi (identifier) i'm working with below
snpis = mydict['snpis'] #dict i'm working with below
</code></pre>
<p>要获取<code>[id, value]</code>列表(不仅仅是值列表),我使用以下命令:</p>
<pre><code>[[id,val] for diff, val, id in sorted((abs(x['value']-value), x['value'], x['npi']) for x in snpis)[:6]]
</code></pre>
<p>由此产生:</p>
<pre><code>[[u'1932190360', 2672],
[u'1114020336', 3264],
[u'1538182779', 995],
[u'1801894142', 497],
[u'1336147685', 284],
[u'1912989989', 232]]
</code></pre>
<p><em>编辑</em></p>
<p>我发现,如果你处理的是一个dict(或列表),那么操纵Raymond的答案也很容易。</p>
<pre><code>from heapq import nsmallest
[[i['npi'], i['value']] for i in nsmallest(6, snpis, key=lambda x: abs(x['value']-value))]
</code></pre>
<p>这将产生与上述输出相同的结果。</p>
<p>还有这个</p>
<p><code>nsmallest(6, snpis, key=lambda x: abs(x['value']-value))</code>将生成一个dict。</p>