<p>我坚持最初的解决方案<a href="https://stackoverflow.com/a/23200167/771848">proposed by Burhan Khalid</a>,它利用了<a href="https://docs.python.org/2/library/collections.html#collections.Counter" rel="nofollow noreferrer">^{<cd1>}</a>:</p>
<pre><code>import re
from collections import Counter
with open('input.txt') as f:
c = Counter('.'.join(re.findall(r'(\w+\(\d+\))', line.split()[-1])[-2:]) for line in f)
for domain, count in c.most_common():
print domain, count
</code></pre>
<p>它使用<a href="https://docs.python.org/2/library/collections.html#collections.Counter.most_common" rel="nofollow noreferrer">^{<cd2>}</a>方法,该方法本质上是使用<code>sorted()</code>按值按相反顺序对字典项进行排序。不需要手动操作。你知道吗</p>
<p>仅供参考,以下是<code>most_common()</code>源代码在python2.7上的表现:</p>
<pre><code>def most_common(self, n=None):
'''List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abcdeabcdabcaba').most_common(3)
[('a', 5), ('b', 4), ('c', 3)]
'''
# Emulate Bag.sortedByCount from Smalltalk
if n is None:
return sorted(self.iteritems(), key=_itemgetter(1), reverse=True)
return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))
</code></pre>