あなたがトップ3を求めている、とあなたがアイテムを選んだことができる前にこのようにあなたがデータのカットあなたの特定の並べ替え順序で。
はmost_common()
事前ソート再度並べ替えを持っているのではなく、(n
実際のバケット数よりも小さいを提供)、カスタム基準によってソートするheapq
を使用します。Pythonの2オン
import heapq
def count_words(s, n):
"""Return the n most frequently occuring words in s."""
counts = Counter(s.split())
key = lambda kv: (-kv[1], kv[0])
if n >= len(counts):
return sorted(counts.items(), key=key)
return heapq.nsmallest(n, counts.items(), key=key)
、あなた上記の呼び出しにitems()
ではなくiteritems()
を使用することをお勧めします。
これにより、Counter.most_common()
methodが更新されたキーで再作成されます。元のようにheapq
を使用すると、O(NlogN)ではなくO(NlogK)のパフォーマンスにバインドされます(N
バケットの数、Kは見たい上位の要素数)。
デモ:
>>> count_words("cat bat mat cat cat mat mat mat bat bat cat", 3)
[('cat', 4), ('mat', 4), ('bat', 3)]
>>> count_words("betty bought a bit of butter but the butter was bitter", 3)
[('butter', 2), ('a', 1), ('betty', 1)]
>>> count_words("betty bought a bit of butter but the butter was bitter", 6)
[('butter', 2), ('a', 1), ('betty', 1), ('bit', 1), ('bitter', 1), ('bought', 1)]
とPython 3.6のクイック性能比較(。0B1):あなたが代わりにmost_common
にn
を与えるのは、仕分けして、結果をスライスし、.most_common()
を行うことによってそれを修正することができ
>>> from collections import Counter
>>> from heapq import nsmallest
>>> from random import choice, randrange
>>> from timeit import timeit
>>> from string import ascii_letters
>>> sentence = ' '.join([''.join([choice(ascii_letters) for _ in range(randrange(3, 15))]) for _ in range(1000)])
>>> counts = Counter(sentence) # count letters
>>> len(counts)
53
>>> key = lambda kv: (-kv[1], kv[0])
>>> timeit('sorted(counts.items(), key=key)[:3]', 'from __main__ import counts, key', number=100000)
2.119404911005404
>>> timeit('nsmallest(3, counts.items(), key=key)', 'from __main__ import counts, nsmallest, key', number=100000)
1.9657367869949667
>>> counts = Counter(sentence.split()) # count words
>>> len(counts)
1000
>>> timeit('sorted(counts.items(), key=key)[:3]', 'from __main__ import counts, key', number=10000) # note, 10 times fewer
6.689963405995513
>>> timeit('nsmallest(3, counts.items(), key=key)', 'from __main__ import counts, nsmallest, key', number=10000)
2.902360848005628
をあなたは( '.most_commonをすることによってそれを修正できます) 'に' most_common'を 'n 'するのではなく、結果をソートしてスライスします。 – L3viathan