【问题标题】:Python KeyError while comparing chars in dict and list比较字典和列表中的字符时出现Python KeyError
【发布时间】:2014-05-13 15:31:01
【问题描述】:

我在比较 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 否则 += 零 我认为通过使用 if/else 语句可以绕过 KeyError。

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

【问题讨论】:

  • 对不起,但我已经多次尝试阅读和重读这个问题,但我仍然不太明白你在这里想要达到什么目的。

标签: python dictionary frequency keyerror


【解决方案1】:

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

chr(i+97)bchars 中第i 个字符的索引,但映射到从'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 甚至带有a class just for doing this sort of thing

【讨论】:

    【解决方案2】:

    嵌套字典似乎没有必要:

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

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        相关资源
        最近更新 更多