在Python中,如何根据键的频率编辑字典中的值?

时间:2012-03-01 00:10:45

标签: python dictionary

我正在创建一个程序,它读取名称(姓氏,名字)的.txt文件,每行一个,并创建一个字典,显示特定名字重复的次数。

到目前为止,我已经获得了以下代码,但似乎无法准确计算第一个名称重复的次数。我认为问题是我的变量“value”与键值对中的实际值不对应。我该如何解决这个问题?

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 个答案:

答案 0 :(得分:6)

您可能对collections.Counter感兴趣 - 这是一个特殊字典,可用于完成此类任务。

答案 1 :(得分:2)

看起来你想要这样的东西:

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

此外,我强烈建议您选择dict以外的名称,例如names。原因是dict是标准Python字典类型的名称(就像您通常不希望创建名为strintlist的Python变量一样)。

还有其他解决方案,例如使用collections.defaultdict会更简洁。

答案 2 :(得分:2)

您可以将if块替换为:

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

或者,您可以使用collections.Counter代替词典。这简化了将代码计算到:

c[firstname] += 1

其中 c 计数器实例。

答案 3 :(得分:2)

像这样使用defaultdict

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

您可能希望通过删除空格和大写来规范化您的名称。

答案 4 :(得分:2)

正如@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})

答案 5 :(得分:2)

with open('names.txt') as f:
    firstNames = [line.split(',')[0] for line in f]

print collections.Counter(firstNames)