删除键时词典中的键错误

时间:2018-12-26 09:32:44

标签: python dictionary

我正在尝试计算字符串,我想删除值为1和2的键。我可以使用以下脚本成功计算字符串。如果我在字典中添加if循环,则在尝试打印时会抛出键错误“ d”。

s = "aaabbbd"
def check_freq(s):
     freq = {}
     for c in s:
        freq[c] = s.count(c)
     for w in sorted(freq, key=freq.get, reverse=True):
         if freq[w] == 1:
             del freq[w]
             print (w, freq[w])

check_freq(s)

错误在下面

File "<ipython-input-60-a79c71ac1b31>", line 10, in check_freq
    print (w, freq[w])

KeyError: 'd'

预期产量

  

{'a':3,'b':3}

6 个答案:

答案 0 :(得分:4)

如果删除密钥,如何打印?因为该密钥已删除,所以由于该密钥不再存在而引发KeyError。只需在删除时添加继续即可。

s = "aaabbbd"
def check_freq(s):
    freq = {}
    for c in s:
        freq[c] = s.count(c)
    for w in sorted(freq, key=freq.get, reverse=True):
        if freq[w] == 1:
            del freq[w]
            continue
        print (w, freq[w])
    return freq
result = check_freq(s)

>a 3
b 3

result 
> {'a': 3, 'b': 3}

答案 1 :(得分:0)

通过从freq字典中删除条目,您将无法再打印它;它不存在。您可以添加else子句来防止这种情况:

 for w in sorted(freq, key=freq.get, reverse=True):
     if freq[w] == 1:
         del freq[w]
     else:
         print (w, freq[w])

答案 2 :(得分:0)

KeyError的发生是因为您写作时

if freq[w] == 1:
    del freq[w]
    print (w, freq[w])

w = 'd'freq[w] = 1。因此,您要删除freq[w],但是在下一行中,您尝试打印的freq[w]不存在。 您可以使用if-else子句来避免这种情况。

s = "aaabbbd"
def check_freq(s):
    freq = {}
    for c in s:
        freq[c] = s.count(c)
    for w in sorted(freq, key=freq.get, reverse=True):
        if freq[w] == 1 or freq[w] == 2:
            del freq[w]
        else:
            print (w, freq[w])
print(freq)

check_freq(s)

输出:

a 3
b 3
{'a': 3, 'b': 3}

答案 3 :(得分:0)

您可以尝试以下方法:

s = "aaabbbd"

def check_freq(s):
    freq = {}
    for c in s:
        freq[c] = s.count(c)

    for key, value in freq.items():
        if value == 1:
            del freq[key]

    return freq

print check_freq(s)

输出:

{'a':3,'b':3}

实际上,您不需要对字典进行排序。您只需要遍历其元素并检查密钥是否等于1。然后从字典中删除此键值对。

答案 4 :(得分:0)

代替删除键,您总是可以只保留值大于2的键来重建新词典。

from collections import Counter

s = "aaabbbd"

counts = {k: v for k, v in Counter(s).items() if v > 2}

print(counts)
# {'a': 3, 'b': 3}

还使用collections.Counter()来构造计数。使用s.count()效率很低,因为它每次都会扫描整个字符串以计算一个字符。这最终是二次O(N ^ 2),因为它必须访问每个字符的每个字符。 Counter()只计算一次遍历中的所有字符,即O(N)。

如果要从同一词典中删除,则可以遍历一个副本,并使用dict.pop从原始字典中删除:

from collections import Counter

s = "aaabbbd"

counts = Counter(s)

count_items = list(counts.items())
for k, v in count_items:
    if v <= 2:
        counts.pop(k) # Or del counts[k]

print(counts)
# Counter({'a': 3, 'b': 3})

注意:Counter()dict的子类,因此您可以将它们视为相同。话虽这么说,区别之一是Counter()在不存在键时不会引发KeyError,而是返回0。

这可以在这里证明:

>>> from collections import Counter
>>> x = Counter({'a': 1})
>>> y = {'a': 1}
>>> x['b']
0
>>> y['b']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'b'

答案 5 :(得分:0)

在try块中保留删除,这对我有用。

try:
   del freq[w]
except Exception as e:
   print(e)