2016-09-13 16 views
0

ich ein Problem mit dem folgenden Problem:Am häufigsten vorkommenden n Wörter in einem String

Problem:

Implementieren einer Funktion count_words() in Python, die einen String s als Eingabe und eine Reihe n und gibt die n am häufigsten vorkommenden Wörter in s zurück. Der Rückgabewert sollte eine Liste von Tupeln sein - die obersten n Wörter gepaart mit ihren jeweiligen Zählungen [(,), (,), ...], sortiert in absteigender Zählreihenfolge.

Sie können davon ausgehen, dass alle Eingaben in Kleinbuchstaben erfolgen und keine Interpunktionszeichen oder andere Zeichen (nur Buchstaben und einzelne Trennzeichen) enthalten. Im Falle eines Unentschiedens (gleiche Anzahl), bestellen Sie die gebundenen Wörter alphabetisch.

ZB:

Druck count_words ("betty ein wenig Butter gekauft, aber die Butter war bitter", 3) Ausgang:

[('Butter', 2), ('a', 1), ('betty', 1)]

Dies ist meine Lösung:

"""Count words.""" 

from operator import itemgetter 
from collections import Counter 

def count_words(s, n): 
    """Return the n most frequently occuring words in s.""" 

    # TODO: Count the number of occurences of each word in s 
    words = s.split(" "); 
    words = Counter(words) 
    # TODO: Sort the occurences in descending order (alphabetically in case of ties) 
    print(words) 
    # TODO: Return the top n words as a list of tuples (<word>, <count>) 
    top_n = words.most_common(n) 
    return top_n 

def test_run() 

    """Test count_words() with some inputs.""" 
    print(count_words("cat bat mat cat bat cat", 3)) 
    print(count_words("betty bought a bit of butter but the butter was bitter", 3)) 


if __name__ == '__main__': 
    test_run() 

Das Problem besteht darin, dass Elemente mit gleichen Zählungen sind orde rot willkürlich, wie kann ich diese Elemente nach alphabetischer Reihenfolge bestellen?

+0

[Sie sortieren] (https://wiki.python.org/moin/HowTo/Sorting). – usr2564301

+0

Wie kann ich nur die Elemente mit gleicher Anzahl sortieren? –

Antwort

3

Sie können sie die Anzahl von Vorkommen mit sortieren (in umgekehrter Reihenfolge) und dann die lexikographische Reihenfolge:

>>> lst = [('meat', 2), ('butter', 2), ('a', 1), ('betty', 1)] 
>>> 
>>> sorted(lst, key=lambda x: (-x[1], x[0])) 
#       ^reverse order 
[('butter', 2), ('meat', 2), ('a', 1), ('betty', 1)] 

Die Anzahl des Auftretens hat Vorrang vor der lex. Auftrag.

In Ihrem Fall verwenden Sie words.items() anstelle der Liste der Liste, die ich verwendet habe. Sie müssen nicht mehr most_common verwenden, da sorted bereits dasselbe tut.

+0

'Counter.most_common (n)' gibt bereits eine Liste von Tupeln zurück. Kein Aufruf von '.items()' – kjaquier

+0

@kjaquier Es ist nicht nötig 'most_common' zu verwenden, da die Reihenfolge der Elemente mit gleicher Anzahl beliebig ist. 'Sortiert' kann beides. –

+0

Ok, gut. Na dann wäre es "sortiert" (words.items(), key = ...) [: n] ' – kjaquier

0

Die Python-Funktion sorted ist stable, was bedeutet, dass im Falle eines Unentschiedens die gebundenen Elemente in derselben Reihenfolge stehen. Aus diesem Grund können Sie zunächst auf den Saiten sortieren, um zu erhalten:

alphabetical_sort = sorted(words.items(), key=lambda x: x[0]) 

und dann auf den Grafen:

final_sort = sorted(alphabetical_sort, key=lambda x: x[1], reverse=True) 

Edit: Hat nicht Moses bessere Antwort sehen. Natürlich, je weniger sortiert, desto besser.

0

Dies ist ein weiterer Weg, um das Problem der Konzeptualisierung:

def count_words (s, n):

words = s.split(" ") 
# TODO: Count the number of occurences of each word in s 
counters = {} 
for word in words: 
    if word in counters: 
     counters[word] += 1 
    else: 
     counters[word] = 1 
# TODO: Sort the occurences in descending order (alphabetically in case of ties) 
top = sorted(counters.iteritems(), key=lambda d:(-d[1],d[0])) 

# TODO: Return the top n words as a list of tuples (<word>, <count>) 
top_n = top[:n] 
return top_n 

def test_run():

print count_words("cat bat mat cat bat cat", 3) 
print count_words("betty bought a bit of butter but the butter was bitter", 3) 

wenn Name == 'Haupt': test_run()

Verwandte Themen