14

私が辞書を持っているとしましょう:

{key1:value1........... keyn:valuen}

関数を書きたいとしましょう

def return_top_k(dictionary, k):

    return list_of_keys_sorted   

上位k個の値を持つキーを取得するための(大きなOの観点から)最も効率的な方法は何ですか(順序を維持する、つまり、最初に最も高い値のキーが存在するなど)。

4

6 に答える 6

26

O(n log k)

import heapq

k_keys_sorted = heapq.nlargest(k, dictionary)

keyキーワードパラメータを使用して、並べ替えキーとして使用するものを指定できます。例:

k_keys_sorted_by_values = heapq.nlargest(k, dictionary, key=dictionary.get)
于 2012-09-04T15:27:09.373 に答える
7
return sorted(dictionary, key=dictionary.get, reverse=True)[:10]

最悪の場合O(NlogN)(他のheapq人が提案した方が良いでしょうが)...

通常の辞書の代わりに使用することも理にかなっているかもしれません。Counterその場合、most_commonメソッドは(おおよそ)あなたが望むことを実行します( )が、APIdictionary.most_common(10)でを使用することが理にかなっている場合に限ります。Counter

于 2012-09-04T15:24:39.377 に答える
4
portfolio = [
   {'name': 'IBM', 'shares': 100, 'price': 91.1},
   {'name': 'AAPL', 'shares': 50, 'price': 543.22},
   {'name': 'FB', 'shares': 200, 'price': 21.09},
   {'name': 'HPQ', 'shares': 35, 'price': 31.75},
   {'name': 'YHOO', 'shares': 45, 'price': 16.35},
   {'name': 'ACME', 'shares': 75, 'price': 115.65}
]

cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
于 2016-05-27T08:33:47.807 に答える
3

トップ3のステップバイステップ:

>>> from operator import itemgetter
>>> dct = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
>>> sorted(dct.items(), key=itemgetter(1), reverse=True)
[('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)]
>>> map(itemgetter(0), sorted(dct.items(), key=itemgetter(1), reverse=True))
['e', 'd', 'c', 'b', 'a']
>>> map(itemgetter(0), sorted(dct.items(), key=itemgetter(1), reverse=True))[:3]
['e', 'd', 'c']

またはheapqモジュールを使用する

>>> import heapq
>>> from operator import itemgetter
>>> heapq.nlargest(3, dct.items(), key=itemgetter(1))
[('e', 5), ('d', 4), ('c', 3)]
>>> map(itemgetter(0), _)
['e', 'd', 'c']
于 2012-09-04T15:28:33.993 に答える
1

コード内

dct = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
k = 3
print sorted(dct.keys(), reverse=True)[:k]

値も必要な場合:

print sorted(dct.items(), reverse=True)[:k]

または、使用したい場合OrderedDict

from collections import OrderedDict
d = OrderedDict(sorted(dct.items(), reverse=True))
print d.keys()[:k]
于 2015-04-14T01:02:59.590 に答える
0

したがって、上位K個の頻繁な要素を辞書から印刷する場合。heapq.nlargestfuntcionを使用する必要があります。

同じ例を次に示します。

return heapq.nlargest(k,count.keys(), key = count.get)

ここで、kは、辞書内でk回またはk回以上繰り返されている要素を見つけるのに役立つ数です。

count.keys():これにより、を使用して作成されたヒープに存在するキーまたは要素が提供されます。collections.counter

key = count.get():これは、ヒープのキーを印刷するために使用されます。これをスキップすると、ディクショナリの値、つまり要素がディクショナリに出現する回数を出力します。

于 2021-01-14T15:14:38.787 に答える