字典推导及创建时检查键

1 投票
3 回答
851 浏览
提问于 2025-04-16 13:53

我有一个任务,要读取一个文件,把每个字符存到一个字典里,字符作为键,出现的次数作为值,这样就写出了下面的代码:

chrDict = {}
with open("gibrish.txt", 'r') as file:
    for char in file.read():
        if char not in chrDict:
            chrDict[char] = 1
        else:
            chrDict[char] += 1

这段代码能正常工作,但在我看来,至少在Python中,这样写起来真的很难看。我尝试了不同的写法,想用更简洁的方式来实现。有没有办法用更简洁的写法来完成这个任务呢?我试过在创建时使用locals(),但那样似乎很慢,而且如果我理解得没错,locals会包含在这个写法启动时的所有作用域里的内容,这样反而让事情变得更复杂。

3 个回答

0

字典的 get() 方法会给你返回一个值,如果这个值存在的话;如果不存在,就返回 0。

chrDict = {}
with open("gibrish.txt", 'r') as file:
   for char in file.read():
        chrDict[char] = chrDict.get(char, 0) + 1
4

使用 defaultdict:

from collections import defaultdict

chr_dict = defaultdict(int)
with open("gibrish.txt", 'r') as file:
    for char in file.read():
        chr_dict[char] += 1

如果你真的想用列表推导式,可以使用这个效率不高的变体:

text = open("gibrish.txt", "r").read()
chr_dict = dict((x, text.count(x)) for x in set(text))
7

Python 2.7中,你可以使用Counter这个工具:

from collections import Counter

with open("gibrish.txt", 'r') as file:
    chrDict = Counter(f.read())

撰写回答