我正在尝试计算字符串,我想删除值为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}
答案 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)