在比较字典和列表中的字符时的Python KeyError

时间:2014-05-13 15:31:02

标签: python dictionary frequency keyerror

我有一个关于dict中的char键和列表中的char之间的比较的问题。 任务是阅读文本并计算所有开头的字母。

我有一个包含字符的列表:

bchars = ('i','g','h','n','h')

并且字母和频率的字典默认为零:

d = dict(dict())
  for i in range(97,123):
    d[i-97]={chr(i):0}

不,我想检查如下:

for i in range(len(bchars)):
  for j in range(len(d)):
    if(bchars[i] in d[j]):
      d[j][chr(i+97)] +=1
    else:
      d[j][chr(i+97)] +=0

所以如果列表中的char是某个位置的键,那么+ = 1 else + = 0 我想通过使用if / else语句我可以绕过KeyError。

还有更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:1)

嵌套词典似乎没什么必要:

d = [0] * 26
for c in bchars:
    d[ord(c)-97] += 1

您可能还想查看Counter模块中的collections类。

答案 1 :(得分:1)

具体问题是,您检查bchars[i]是否为in d[j],但实际使用的密钥为chr(i+97)

chr(i+97)ibchars个字符的索引,但是映射到从'a'开始的ASCII字符。你为什么要用它作为你的钥匙?

我想你真的想这样做:

for i in range(len(bchars)):
    for j in range(len(d)):
        if(bchars[i] in d[j]):
            d[j][bchars[i]] += 1
        else:
            d[j][bchars[i]] = 1

请注意,您无法在+=中使用else;记住你是如何字面上检查密钥是否在那里并且决定它不是?

更广泛地说,你的代码没有意义 - 它过于复杂,并没有使用Python字典的真正功能。 d看起来像:

{0: {'a': 0}, 1: {'b': 0}, 2: {'c': 0}, ...}

将字典映射字符直接构建为count会更加明智:

{'a': 0, 'b': 0, 'c': 0, ...}

然后你就可以做到:

for char in bchars:
    if char in d:
        d[char] += 1

Python甚至附带a class just for doing this sort of thing

答案 2 :(得分:1)

from collections import Counter

bchars = ('i','g','h','n','h')
counts = Counter(bchars)
print(counts)
print(counts['h']) 

打印

Counter({'h': 2, 'i': 1, 'g': 1, 'n': 1})
2