/ / Ako v Pythone upravujete hodnoty v slovníku na základe frekvencie jeho kľúča? - python, slovník

V Pythone, ako upravujete hodnoty v slovníku na základe frekvencie jeho kľúča? - python, slovník

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ď č. 1

Mož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)