簡體   English   中英

python字典keyError

[英]python dictionary keyError

python的新手,看起來像是一個簡單可行的代碼,產生了KeyError

patt=list('jkasb')

dict={}
for i in patt:
    dict[i]= 1 if dict[i] is None else dict[i]+1 # This line throws error

錯誤:KeyError:'j'

在您的情況下,KeyError正在發生,因為您正在嘗試訪問不在字典中的鍵。 最初,字典是空的。 因此,其中沒有密鑰存在。

如果您來自C ++背景,這可能看起來很奇怪,因為C ++映射為尚不存在的鍵提供了默認值。 您可以使用collections.defaultdict在python中獲得相同的行為。 修改后的代碼如下。 我冒昧地將defaultdict轉換為代碼末尾的常規字典:

from collections import defaultdict
patt='jkasb'

my_default_dict=defaultdict(int)
for i in patt:
    my_default_dict[i]+=1

my_dict = dict(my_default_dict) # converting the defaultdict to a regular dictionary

您還可以通過許多其他方式解決此問題。 我在下面展示其中一些:

  • 通過檢查字典中是否存在密鑰:

     patt='jkasb' my_dict={} for i in patt: my_dict[i]= 1 if i not in my_dict else my_dict[i]+1 # checking if i exists in dict 
  • 使用沒有默認返回值的dict.get()

     patt='jkasb' my_dict={} for i in patt: my_dict[i]= 1 if my_dict.get(i) is None else my_dict[i]+1 # using dict.get print(my_dict) 
  • 使用帶有默認返回值的dict.get()

     patt='jkasb' my_dict={} for i in patt: my_dict[i]= my_dict.get(i, 0)+1 # using dict.get with default return value 0 
  • 由於您的代碼實際上只是計算每個字符的頻率,您還可以使用collections.Counter然后將其轉換為字典:

     from collections import Counter patt='jkasb' character_counter = Counter(patt) my_dict = dict(character_counter) 

另外,由於dict是內置數據類型,我使用dict將defaultdict和Counter轉換為普通字典,我將字典的名稱從dict更改為my_dict。

在構建dict dictdict[i]正在嘗試訪問尚不存在的密鑰,為了檢查字典中是否存在密鑰,請使用in運算符:

d[i] = 1 if i not in d else d[i] + 1

替代品(為了你想要完成的事情):

使用dict.get

d[i] = d.get(i, 0) + 1

使用collections.defaultdict

from collections import defaultdict
d = defaultdict(int)
for i in 'jkasb':
    d[i] += 1

使用collections.Counter

from collections import Counter
d = Counter('jkasb')

避免使用dict (內置類型)作為變量名。 只需迭代'jkasb'而不必將其轉換為列表,字符串也是可迭代的。

由於你的dict最初是空的,嘗試使用dict[i]訪問任何值都會引發KeyError

您應該將此替換為.get() ,如果找不到該鍵,則返回None

for i in patt:
    dict[i] = 1 if dict.get(i) is None else dict[i] + 1

正如@snakecharmerb所建議的另一種選擇是事先檢查你的dict中是否存在密鑰:

for i in patt:
    dict[i] = 1 if i not in dict else dict[i] + 1

兩種解決方案都是等價的,但第二種可能更“慣用”。

這些片段: dict[i]dict[i]+1將嘗試使用相應的鍵i從字典中獲取值。 由於詞典中沒有任何內容,因此會出現KeyError。

您正在嘗試訪問空字典中的密鑰,您也可以使用defaultdic,因此您不關心密鑰是否已存在:

from collections import defaultdict

patt=list('jkasb')

my_dict = defaultdict(int) 
for i in patt:
   my_dict[i] += 1 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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