Python 将文件转换为具有字符重复计数值的字典

Python 将文件转换为具有字符重复计数值的字典,python,dictionary,text-files,Python,Dictionary,Text Files,我正在尝试编写一个函数,该函数将接收保存在计算机中的文本文件,然后它将读取文件中的所有名称,并仅获取每个名称的第一个字符,每个名称都位于新行中。这些字符将是我正在创建的字典的键,值将是文件中名称以该字母开头的次数。因此,如果文本文件如下所示: Mary Jane Anna Judith Kim Melody Myriam Lauren Betty Holley 那么我的字典应该是: {'A':1, 'B':1, 'H':1, 'J':2, 'K':1, 'L':1, 'M':3} 到目前为止

我正在尝试编写一个函数,该函数将接收保存在计算机中的文本文件,然后它将读取文件中的所有名称,并仅获取每个名称的第一个字符,每个名称都位于新行中。这些字符将是我正在创建的字典的键,值将是文件中名称以该字母开头的次数。因此,如果文本文件如下所示:

Mary
Jane
Anna
Judith
Kim
Melody
Myriam
Lauren
Betty
Holley
那么我的字典应该是:

{'A':1, 'B':1, 'H':1, 'J':2, 'K':1, 'L':1, 'M':3}
到目前为止,我的代码如下所示:

def newDictionary():
names={}
char = []
file = open(names)
lines = file.readlines()
for line in lines:
    1char = file.read(line[1])
    1char.append(char)
    for keys,values in names():

return names
我知道它还没有完成,但我不知道如何添加第一个字符重复的次数,然后使这些值对应于正确的键。请帮帮我。 谢谢

您可以使用:

这将打印:

Counter({'M': 3, 'J': 2, 'A': 1, 'B': 1, 'H': 1, 'K': 1, 'L': 1})

聪明的方法是使用a,这是一种用于计算事物的特殊类型的字典。但您也可以使用普通字典:

def newDictionary(filename):
    names = {}
    with open(filename) as f:
        for line in f:
            first = line[0]
            if first in names:
                names[first] += 1
            else:
                names[first] = 1
    return names

names = newDictionary('qdata')
print(names)
输出

{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1}
{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1}

您的问题中的代码有几个问题

变量名必须以字母或下划线开头,不能以数字开头,因此
1char
会给出语法错误

您正在使用
名称
作为字典的名称,但您还试图将其作为
open()
的文件名,这是行不通的。即使您在代码的前面将
names
设置为正确的文件名,一旦您设置了
names={}
它现在引用一个空字典

您可以使用
lines=file.readlines()
将文件的行放入一个列表中,然后执行
file.read(行[1])
。您不需要再次读取该文件:您已经获得了它的所有内容。此外,在
file.readlines()
之后,文件指针位于文件的末尾,因此您无法从中读取更多数据(除非使用其
.seek()
方法“倒带”文件)


另外,您需要
行的第一个字符。您可以通过
行[0]
获得,因为Python使用基于零的索引<代码>行[1]
获取行中的第二个字符。

一些更改将使代码可行:

def newDictionary():
    names={}
    lines = open(in_file).readlines()
    for item in lines:
        names[item[0]]=names.get(item[0],0)+1
    return names
输出:

{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1}