/ / Wie können Sie in Python die Werte in einem Wörterbuch basierend auf der Häufigkeit ihres Schlüssels bearbeiten? - Python, Wörterbuch

Wie bearbeiten Sie in Python die Werte in einem Wörterbuch basierend auf der Häufigkeit seines Schlüssels? - Python, Wörterbuch

Ich erstelle ein Programm, das eine TXT-Datei mit Namen (Nachname, Vorname) liest, eine pro Zeile, und ein Wörterbuch erstellt, das die Häufigkeit anzeigt, mit der sich ein bestimmter Vorname wiederholt.

Ich habe den folgenden Code bis jetzt erhalten, kann aber nicht scheinenum genau zu zählen, wie oft sich ein Vorname wiederholt. Ich denke, das Problem ist, dass meine Variable "value" nicht dem tatsächlichen Wert im Schlüsselwertpaar entspricht. Wie kann ich das beheben?

file = open("names.txt")

dict = {}
value = 1

for line in file:
listOfNames = line.split(",")
firstName = listOfNames[1]

if dict.has_key(firstName):
value += 1
else:
dict[firstName] = value

file.close()

Antworten:

6 für die Antwort № 1

Vielleicht interessiert dich das Sammlungen. Zähler - das ist ein spezielles Wörterbuch für genau diese Art von Aufgabe.


2 für die Antwort № 2

Es sieht so aus, als ob Sie etwas möchten wie:

if dict.has_key(firstName):
dict[firstName] += 1
else:
dict[firstName] = 1

Auch würde ich stark Ich empfehle Ihnen, einen anderen Namen als zu wählen dict, sowie names. Der Grund ist, dass dict ist der Name des Standard-Python-Wörterbuchtyps (genau wie Sie normalerweise keine aufgerufenen Python-Variablen erstellen möchten) str, int, oder list).

Es gibt andere Lösungen wie die Verwendung collections.defaultdict das wird prägnanter sein.


2 für die Antwort № 3

Sie können den if-Block ersetzen durch:

dict[firstname] = dict.get(firstname, 0) + 1

Alternativ können Sie verwenden Sammlungen. Zähler anstelle eines Diktats. Das vereinfacht das Zählen von Code auf:

c[firstname] += 1

woher c ist ein Zähler Beispiel.


2 für die Antwort № 4

Wie @Aurora erwähnt, ist Counter perfekt dafür.

>>> names = ["foo bar", "foo baz", "foo car", "doo bar", "doo baz", "boo paz"]
>>> from collections import Counter
>>> Counter(name.split()[1] for name in names)
Counter({"baz": 2, "bar": 2, "paz": 1, "car": 1})

2 für die Antwort № 5

Benutze einen Standarddict so was:

from collections import defaultdict
d = defaultdict(int)
for name in open("names.txt"):
_, first_name = name.split(",")
d[first_name] += 1

Sie können Ihre Namen normalisieren, indem Sie Leerzeichen und Großschreibung entfernen.


2 für die Antwort № 6
with open("names.txt") as f:
firstNames = [line.split(",")[0] for line in f]

print collections.Counter(firstNames)