-1

我在比较 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

因此,如果列表中的字符是某个位置的键,那么 += 1 else += zero 我认为通过使用 if/else 语句我可以绕过 KeyError。

有没有更优雅的解决方案?

4

3 回答 3

1

嵌套字典似乎没有必要:

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

您可能还想查看模块中的Countercollections

于 2014-05-13T15:37:04.350 回答
1

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

chr(i+97)i是 中的第 th 个字符的索引bchars,但映射到从 开始的 ASCII 字符'a'。为什么要使用它作为密钥?

我想你真的想做:

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 甚至附带了一个专门用于执行此类操作的类

于 2014-05-13T15:38:11.350 回答
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
于 2014-05-13T15:44:02.270 回答