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)

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]] 
  • 1d list indexing python: verbessern maskableList
  • Sortierung einer Liste von Tupeln mit 3 Elementen in Python
  • Sortieren eines Wörterbuchs von Tupeln in Python
  • Benutzerdefinierte Sortierspalten in Multi Level Pandas Dataframe
  • Wie man die schnelle Sortierung nach Index in einer Liste einer Liste sortiert
  • Bubble Art Hausaufgabe
  • Sortieren Sie ein numpy Array durch ein anderes Array, entlang einer bestimmten Achse, mit weniger Speicher
  • Python-Sortierliste von Tupel
  • Python ist die beste Programmiersprache der Welt.