В Python, как вы редактируете значения в словаре в зависимости от частоты его ключа? - PullRequest
4 голосов
/ 01 марта 2012

Я создаю программу, которая читает файл с именами (фамилия, имя) в формате .txt, по одному на строку, и создает словарь, который показывает количество повторений конкретного имени.

Я получил следующий код, но не могу точно подсчитать, сколько раз повторяется имя.Я думаю, что проблема заключается в том, что моя переменная «значение» не соответствует фактическому значению в паре ключ-значение.Как я могу это исправить?

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()

Ответы [ 6 ]

6 голосов
/ 01 марта 2012

Вас может заинтересовать collection.Counter - специальный словарь, предназначенный именно для такого рода задач.

2 голосов
/ 01 марта 2012
with open('names.txt') as f:
    firstNames = [line.split(',')[0] for line in f]

print collections.Counter(firstNames)
2 голосов
/ 01 марта 2012

Как упоминает @Aurora, Counter идеально подходит для этого.

>>> 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 голосов
/ 01 марта 2012

Используйте defaultdict , например, так:

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

Возможно, вы захотите нормализовать свои имена, удалив пробелы и заглавные буквы.

2 голосов
/ 01 марта 2012

Блок if можно заменить на:

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

В качестве альтернативы вы можете использовать collection.Counter вместо dict.Это упрощает подсчет кода до:

c[firstname] += 1

, где c - это Counter instance.

2 голосов
/ 01 марта 2012

Похоже, вы хотите что-то вроде:

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

Кроме того, я бы настоятельно рекомендовал бы выбрать имя, отличное от dict, например names. Причина в том, что dict является именем стандартного типа словаря Python (так же, как вы обычно не хотите создавать переменные Python, называемые str, int или list).

Существуют и другие решения, такие как использование collections.defaultdict, которое будет более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...