我正在做作业,我一直在努力想一个解决办法。
我们被要求使用字典计算随机单词(假设是"ADASDA$dadqEQE@!$aQ"
)中的字母数。计数应该不区分大小写,不能使用非字母。我做了一些在线搜索,似乎每个人基本上都使用isalpha()
或regex,但它们都不允许在我的情况下。
我想先添加一个特定的列表(全部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
如果您可以使用collections
,那么我建议使用collections.Counter
>>> from collections import Counter
>>> from string import ascii_letters
>>> s = "ADASDA$dadqEQE@!$aQ"
>>> c = Counter(i.upper() for i in s if i in ascii_letters)
>>> c
Counter({'A': 5, 'D': 4, 'Q': 3, 'E': 2, 'S': 1})
如果手工操作,不需要定义字典,只需在遇到元素时添加元素
from string import ascii_letters
lettercount = {}
for letter in s:
if letter not in ascii_letters:
continue
if letter.upper() in lettercount:
lettercount[letter.upper()] += 1
else:
lettercount[letter.upper()] = 1
>>> lettercount
{'A': 5, 'D': 4, 'S': 1, 'Q': 3, 'E': 2}
首先,你没有正确地迭代字典的值。编写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个字母,然后遍历该列表以从dictionary中删除元素:
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
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 range(65,91):
if lettercount[chr(value)] == 0:
lettercount.pop(chr(value))
return lettercount
试试这个。