python - 使用字典计数并删除不相关的值
问题描述
我正在做学校的工作,我一直在努力寻找解决方案。
我们被要求使用字典计算随机单词中的字母(比方说"ADASDA$dadqEQE@!$aQ"
)。计数应该与大小写无关,并且不能使用非字母顺序。我做了一些在线搜索,似乎每个人基本上都使用isalpha()
或正则表达式,但在我的情况下它们都不允许。
我考虑过首先添加一个特定的列表(所有 26 个 ASCII 字母),这样非字母字符就不会被计算在内。之后,我们可以删除带有 0 的条目。但是,我似乎很难执行删除 0 的最后一步。最后一部分可能是错误的,但我不确定删除所有值为 0 的条目的正确说法是什么。
def count_letters(string):
lettercount = {"A" : 0,
"B" : 0,
"C" : 0,
"D" : 0,
"E" : 0,
"F" : 0,
"G" : 0,
"H" : 0,
"I" : 0,
"J" : 0,
"K" : 0,
"L" : 0,
"M" : 0,
"N" : 0,
"O" : 0,
"P" : 0,
"Q" : 0,
"R" : 0,
"S" : 0,
"T" : 0,
"U" : 0,
"V" : 0,
"W" : 0,
"X" : 0,
"Y" : 0,
"Z" : 0}
for i in string.upper():
if i in lettercount:
lettercount[i] += 1
for value in lettercount:
if value == 0:
lettercount.remove(value)
return lettercount
解决方案
首先,您没有正确地迭代字典的值。写作for i in lettercount
给出字典的键。例如,
>>> lettercount = {'A':2, 'B':1}
>>> for i in lettercount:
print(i)
A
B
有几种方法可以迭代值,其中之一如下:
>>> for key, value in lettercount.items():
print(key, value)
A 2
B 1
检查值后,您应该删除键(而不是值)字典,但不应从正在迭代的数据结构中删除元素。相反,您可以将 0 个字母添加到新列表,然后遍历该列表以从字典中删除元素:
for i in string.upper():
if i in lettercount:
lettercount[i] += 1
zero_letters = []
for letter, count in lettercount.items():
if count == 0:
zero_letters.append(letter)
for letter in zero_letters:
lettercount.remove(letter)
return lettercount
但是有更好的方法来解决这个问题。您不需要创建具有 0 值的字典。
def count_letters(string):
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
letters_dict = {}
for i in string:
upper_letter = i.upper()
if upper_letter not in uppercase: continue
letters_dict[upper_letter] = letters_dict.get(upper_letter, 0) + 1
return letters_dict
推荐阅读
- excel - 应用程序退出指令后显示错误 91
- lua - 如何在游戏中找到 roblox 地点的游戏 ID?
- ruby - 为什么多次构建相同的 gemspec 会创建不同的 gem 二进制文件?
- arrays - 循环嵌套数组时如何正确使用类型保护?
- python - 如何超时以使用硒加载页面?
- python - 将数据框拆分为 3 个大小相同的新数据框 - Pandas
- database - 如何将变量连接到数据库中的字段?
- react-native - 是否有一些特殊的环境可以在 react native 中创建桌面应用程序
- python - 在python中创建连接到postgres数据库的方法
- vb.net - 在 Visual Basic 中编辑 DataGridView 的行距