[英]Python dict keyerror in while statement (.get() works)
[英]Python KeyError while comparing chars in dict and list
我有一个关于字典中的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。
有没有更优雅的解决方案?
嵌套字典似乎不是必需的:
d = [0] * 26
for c in bchars:
d[ord(c)-97] += 1
您可能还需要查看collections
模块中的Counter
类。
特定的问题是您检查bchars[i]
是否in d[j]
,但是实际使用的密钥是chr(i+97)
。
chr(i+97)
是第b个字符中的第i
个字符的bchars
,但映射到以'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}, ...}
直接构建一个字典映射字符来计数会更明智:
{'a': 0, 'b': 0, 'c': 0, ...}
那么您可以简单地执行以下操作:
for char in bchars:
if char in d:
d[char] += 1
Python甚至提供了一个类来执行此类操作 。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.