Sortierung von Wörterbüchern nach größten Werten: Klassenmethode

Ich möchte ein bestimmtes Wörterbuch sortieren und eine Liste der Top_n Anzahl der Vorkommnisse zurückgeben. Das Wörterbuch ist eine Sammlung von Wörtern aus einem txt-Dokument, wobei der 'Schlüssel' ein einziges Wort aus der txt-Datei ist und der 'Wert' die Anzahl der Vorkommen im Dokument ist.

Ich habe die init- Methode wie folgt:

def __init__(self:'Collection_of_words', file_name: str) -> None: ''' this initializer will read in the words from the file, and store them in self.counts''' l_words = open(file_name).read().split() s_words = set(l_words) self.counts = dict([ [word, l_words.count(word)] for word in s_words]) 

Nun, eine meiner Instanz Methoden wird eine Liste der Strings der 'Top n' Anzahl der Vorkommnisse givin einige int Argument zurückgeben. Ich habe es geschossen:

 def top_n_words(self, i): '''takes one additional parameter, an int, <i> which is the top number of occurences. Returns a list of the top <i> words.''' return [ pair[0] for pair in sorted(associations, key=lambda pair: pair[1], reverse=True)[:5]] 

Allerdings, wenn ich diesen Code ausführen bekomme ich Fehler und kann nicht herausfinden, warum. Ich bin mir nicht sicher, wie man Wörterbuchobjekte sortiert (zB self.counts)

  • Query Python Wörterbuch, um Wert aus Tupel zu erhalten
  • Json_normalize erzeugt verwirrend KeyError
  • Wie man die Anfangsgröße für ein Wörterbuch in Python festlegt?
  • So ändern Sie das Python 'default' Wörterbuch so, dass es immer einen Standardwert zurückgibt
  • Wie interpretiere ich einen String, um einen Wörterbuchaufruf zu definieren?
  • Ausgabe mit deepcopy mit Wörterbuch im Objekt
  • Iteratoren in Python 3
  • Zugriff auf verschachtelte Wörterbuchelemente über eine Liste von Schlüsseln?
  • 2 Solutions collect form web for “Sortierung von Wörterbüchern nach größten Werten: Klassenmethode”

     sorted(self.counts, key=lambda pair: pair[1], reverse=True) 

    Iterating over self.counts gibt die Schlüssel, nicht Schlüssel-Wert-Paare. Das bedeutet, dass das pair[1] nicht funktioniert. Sie wollen key=self.counts.get .

    Wenn Ihre Liste sowohl Zählungen als auch Schlüssel enthalten muss, müssen Sie stattdessen die Schlüsselwertpaare nach Werten sortieren:

     sorted(self.counts.items(), key=operator.itemgetter(1), reverse=True) 

    Beachten Sie auch, dass collections.Counter bereits tut, was Sie brauchen, und mit einem Zähl-Algorithmus in linearer Zeit statt quadratisch.

    Ich habe dies durch die Schaffung von variablen 'Assoziationen' mit dict_items gelöst. Ex:

     associations = self.counts.items() >>> associations >>>dict_items([('would,', 1), ('Even', 1), ('Cries', 1), ('Sings', 5)]) 

    Ich habe diese Variable dann in einem Listenverständnis verwendet. Ich habe Assoziationen in absteigender Reihenfolge (größte bis kleinste) durch die Schaffung einer Lambda-Funktion und Indizierung der zweiten Element in das Paar. Das Wort mit der größten Anzahl von Vorkommnissen wird im Index [0] in der Liste sein.

     def top_n_words(self, i): associations = self.counts.items() return [ pair[0] for pair in sorted(associations, key=lambda pair: pair[1], reverse=True)[:i]] 
    Python ist die beste Programmiersprache der Welt.