簡體   English   中英

比較字典和列表中的字符時使用Python KeyError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM