我正在创建一个程序,它读取名称(姓氏,名字)的.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()
答案 0 :(得分:6)
您可能对collections.Counter感兴趣 - 这是一个特殊字典,可用于完成此类任务。
答案 1 :(得分:2)
看起来你想要这样的东西:
if dict.has_key(firstName):
dict[firstName] += 1
else:
dict[firstName] = 1
此外,我强烈建议您选择dict
以外的名称,例如names
。原因是dict
是标准Python字典类型的名称(就像您通常不希望创建名为str
,int
或list
的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)