2016-10-14 7 views
1

Ich habe ein Wörterbuch mit der Bezeichnung wordCounts, die ein Wort auf, wie oft es aufgetreten ist, wie kann ich die oberen n Wörter im dict bekommen, während mehr als n, wenn es eine Krawatte?Python Top-Werte im Wörterbuch erhalten

+0

Mit "top" nehme ich an, dass Sie die höchste Wortzahl meinen? – Soviut

+0

Bitte zeigen Sie, was Sie bisher versucht haben. – Soviut

+0

@Soviut ja, das ist richtig. Ich habe Python nie benutzt, und ich habe das Gefühl, dass es dafür eine eingebaute Funktion gibt. – Clip

Antwort

2

Wie die vorherige Antwort sagt, können Sie als Counter eine Umwandlung durchführen, um den Umgang mit diesem Dataset zu erleichtern.

>>> from collections import Counter 
>>> d = {"d":1,"c":2,"a":3,'b':3,'e':0,'f':1} 
>>> c = Counter(d) 
>>> c 
Counter({'b': 3, 'a': 3, 'c': 2, 'f': 1, 'd': 1, 'e': 0}) 

Counter hat eine most_common(n) Methode, die die n häufigsten Elemente brauchen. Beachten Sie, dass es Bindungen ausschließen wird. Deshalb:

>>> c.most_common(4) 
[('b', 3), ('a', 3), ('c', 2), ('f', 1)] 

Um alle Werte gleich dem n-ten Element umfassen, können Sie so etwas wie die folgenden tun, ohne zu einer Counter zu konvertieren. Das ist ziemlich chaotisch, aber es sollte den Trick machen.

from collections import Counter 

def most_common_inclusive(freq_dict, n): 
    # find the nth most common value 
    nth_most_common = sorted(c.values(), reverse=True)[n-1] 
    return { k: v for k, v in c.items() if v >= nth_most_common } 

Sie verwenden können, wie folgt:

>>> d = {'b': 3, 'a': 3, 'c': 2, 'f': 1, 'd': 1, 'e': 0} 
>>> most_common_inclusive(d, 4) 
{'d': 1, 'b': 3, 'c': 2, 'f': 1, 'a': 3} 
1

Eine Lösung könnte:

from collections import Counter, defaultdict 


list_of_words = ['dog', 'cat', 'moo', 'dog', 'pun', 'pun'] 
def get_n_most_common(n, list_of_words): 
    ct = Counter(list_of_words) 
    d = defaultdict(list) 
    for word, quantity in ct.items(): 
     d[quantity].append(word) 
    most_common = sorted(d.keys(), reverse= True) 
    return [(word, val) for val in most_common[:n] for word in d[val]] 

Und die Tests:

>> get_n_most_common(2, list_of_words) 
=> [('pun', 2), ('dog', 2), ('moo', 1), ('cat', 1)] 
>> get_n_most_common(1, list_of_words) 
=> [('pun', 2), ('dog', 2)] 
1

MooingRawr auf dem richtigen Weg ist, aber jetzt müssen wir nur die TopbekommenErgebnisse

l = [] 
for i, (word, count) in enumerate(sorted(d.items(), reverse=True, key=lambda x: x[1])): 
    if i >= n and count<l[-1][1]: 
     break 
    l.append((word, count)) 
+1

Ich würde zu 'für i, (Wort, Anzahl) in Aufzählung (...)' ändern und dann 'i> = n' – brianpck

+0

@brianpck ausgezeichneten Punkt verwenden. Ich wusste, dass es einen besseren Weg gab, aber heute war ein langsamer Tag für mich –