python - 将文件转换为字典以计算出现次数

标签 python

我有一个文件,其内容如下所示:

eng word1
eng word2
eng word3
ita word1
ita word2
fra word1
...

我想统计每个单词在每种语言中出现的次数。为此,我想阅读字典中的文件。 这是我的尝试:

data = open('file', 'r', encoding='utf8')
for line in data:
    lang = line[:3]
    ipa_string = line[3:]
    lang_and_string_dict[lang] = []
    lang_and_string_dict[lang].append(ipa_string)
print(lang_and_string_dict)

这给了我一个带有正确键的字典,但只有最后一个单词,例如英语:

{'eng':[word1]}

最佳答案

好吧,每次您分配一个空列表作为值时:

data = open('file', 'r', encoding='utf8')
for line in data:
    lang = line[:3]
    ipa_string = line[3:]
    <b>lang_and_string_dict[lang] = []</b>
    lang_and_string_dict[lang].append(ipa_string)
print(lang_and_string_dict)

结果,包含前一次出现的旧列表丢失了。如果不存在这样的元素,您应该只创建一个列表,例如:

data = open('file', 'r', encoding='utf8')
for line in data:
    lang = line[:3]
    ipa_string = line[3:]
    <b>if lang not in lang_and_string_dict:</b>
        lang_and_string_dict[lang] = []
    lang_and_string_dict[lang].append(ipa_string)
print(lang_and_string_dict)

由于这种模式很常见,您也可以使用 defaultdict:

<b>from collection import defaultdict

<b>lang_and_string_dict = defaultdict(list)</b>
<b>with</b> open('file', 'r', encoding='utf8') as data:</b>
    for line in data:
        lang = line[:3]
        ipa_string = line[3:]
    lang_and_string_dict[lang].append(ipa_string)
print(lang_and_string_dict)

defaultdictdict 的子类,它使用工厂(此处为 list)以防丢失 key 。因此,每次查询不在字典中的键时,我们都会构造一个列表

您稍后可以使用 dict(lang_and_string_dict) 将此类 defaultdict 转换为 dict

此外,如果您打开(..) 文件,您最好使用with block 来执行此操作。因为如果出现异常,那么文件仍然正确关闭。

关于python - 将文件转换为字典以计算出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50889852/

相关文章:

python - 有没有办法让这段代码更简洁?

python - 计算一维 numpy 数组中的间隙数

python - 将从 keras.backend.argmax 返回的张量作为索引传递给 keras.backend,gather 预计为 'An integer tensor of indices.'

python - 在 NLTK 3.0 中使用 Wordnet 从 Synset 中提取单词

python - Tkinter 列表框

python - PyParsing OR 语句

python - 在Django应用程序中获取上传文件的文件大小

python - 如何使用带有 Python 的 Selenium 切换到框架中的字段

python - 在 crontab 中执行 Python (selenium) 脚本

python :Nested for loops fail on the second loop