Vytváram program, ktorý číta prostredníctvom súboru .txt mien (priezvisko, krstné meno), jeden na riadok a vytvára slovník, ktorý zobrazuje, koľkokrát sa opakuje konkrétne meno.
Doposiaľ som dostal nasledujúci kód, ale nedá sa zdaťna presné spočítanie počtu opakovaní mena. Myslím si, že problém je v tom, že moja premenná „hodnota“ nezodpovedá skutočnej hodnote v páre kľúčovej hodnoty. Ako to môžem opraviť?
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()
odpovede:
6 pre odpoveď č. 1Možno vás bude zaujímať collections.Counter - čo je špeciálny slovník presne pre tento druh úlohy.
2 pre odpoveď č. 2
Vyzerá to, že chcete niečo ako:
if dict.has_key(firstName):
dict[firstName] += 1
else:
dict[firstName] = 1
Tiež by som silne odporúčame zvoliť si iný názov ako dict
, ako napr names
, Dôvodom je to dict
je názov štandardného typu slovníka Python (rovnako ako obvykle nechcete vytvárať tzv. premenné Pythonu str
, int
, alebo list
).
Existujú aj iné riešenia, ako je použitie collections.defaultdict
to bude stručnejšie.
2 pre odpoveď č. 3
Blok if môžete nahradiť:
dict[firstname] = dict.get(firstname, 0) + 1
Môžete tiež použiť collections.Counter namiesto diktátu. To zjednodušuje počítanie kódu iba na:
c[firstname] += 1
kde C je a pult inštancie.
2 pre odpoveď № 4
Ako sa uvádza @ Aurora, Counter je na to perfektný.
>>> 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 pre odpoveď № 5
Použite a defaultdict ako toto:
from collections import defaultdict
d = defaultdict(int)
for name in open("names.txt"):
_, first_name = name.split(",")
d[first_name] += 1
Možno budete chcieť normalizovať svoje mená odstránením medzier a veľkých písmen.
2 pre odpoveď č. 6
with open("names.txt") as f:
firstNames = [line.split(",")[0] for line in f]
print collections.Counter(firstNames)