<p>将所有数据读入字典:</p>
<pre><code>from collections import defaultdict
from operator import itemgetter
scores = defaultdict(int)
with open('my_file.txt') as fobj:
for line in fobj:
name, score = line.split()
scores[name] += int(score)
</code></pre>
<p>以及排序:</p>
^{pr2}$
<p>印刷品:</p>
<pre><code>d 3
b 2
a 1
c 0
</code></pre>
<h2>性能</h2>
<p>为了检查这个答案与来自@SvenMarnach的答案的性能,我将这两种方法都放入了一个函数中。这里<code>fobj</code>是一个打开供读取的文件。
我使用<code>io.StringIO</code>所以IO延迟应该,希望不是测量的:</p>
<pre><code>from collections import Counter
def counter(fobj):
scores = Counter()
fobj.seek(0)
for line in fobj:
key, score = line.split()
scores.update({key: int(score)})
return scores.most_common()
from collections import defaultdict
from operator import itemgetter
def default(fobj):
scores = defaultdict(int)
fobj.seek(0)
for line in fobj:
name, score = line.split()
scores[name] += int(score)
return sorted(scores.items(), key=itemgetter(1), reverse=True)
</code></pre>
<p><code>collections.Counter</code>的结果:</p>
<pre><code>%timeit counter(fobj)
10000 loops, best of 3: 59.1 µs per loop
</code></pre>
<p><code>collections.defaultdict</code>的结果:</p>
<pre><code>%timeit default(fobj)
10000 loops, best of 3: 15.8 µs per loop
</code></pre>
<p>看起来<code>defaultdict</code>快了四倍。我不会猜到的。但说到绩效,你需要衡量。在</p>