<p>使用<a href="https://docs.python.org/3/library/collections.html#collections.defaultdict" rel="nofollow noreferrer"><strong>^{<cd1>}</strong></a>,交换你的<strong><code>keys</code></strong>和<strong><code>values</code></strong></p>
<pre><code>from collections import defaultdict
dct = defaultdict(list)
for k, v in pN.items():
dct[v].append(k)
# defaultdict(<class 'list'>, {10: ['dave', 'jacinta'], 8: ['james'], 6: ['john'], 3: ['jack'], 2: ['sam']})
</code></pre>
<p>使用<strong><code>sorted</code></strong>输出:</p>
^{pr2}$
<p><strong><code>function</code></strong>返回top<strong><code>n</code></strong>用户(将ties视为一个条目):</p>
<pre><code>def top_n(d, n):
dct = defaultdict(list)
for k, v in d.items():
dct[v].append(k)
return sorted(dct.items())[-n:][::-1]
top_n(pN, 3)
# [(10, ['dave', 'jacinta']), (8, ['james']), (6, ['john'])]
</code></pre>
<h3>使用<code>defaultdict</code>既简单又快速,下面是一些时间来证明它:</h3>
<p><strong><em>将定时的函数</p>
<pre><code>def chris_z(d, n):
dct = defaultdict(list)
for k, v in d.items():
dct[v].append(k)
return sorted(dct.items())[-n:][::-1]
def tim_lombard(score_dict, n):
lot = [(k,v) for k, v in score_dict.items()] #make list of tuple from scores dict
nl = []
while len(lot)> 0:
nl.append(max(lot, key=lambda x: x[1]))
lot.remove(nl[-1])
def ajax(d, n:'n_users', top = True):
_ranks = sorted(d.values())
_ranks = _ranks[-n:] if top else _ranks[:n]
return {i:[a for a, b in d.items() if b == i] for i in _ranks}
</code></pre>
<p><strong><em>结果</em></strong></p>
<pre><code>x = [''.join(i) for i in itertools.permutations('chrisz', 6)]
y = [random.randint(0, 100) for _ in range(720)]
z = dict(zip(x, y))
In [40]: %timeit chris_z(z, 500)
110 µs ± 259 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [42]: %timeit tim_lombard(z, 500)
26.2 ms ± 60 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [43]: %timeit ajax(z, 500)
15.3 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
</code></pre>