首页 > 解决方案 > 使用字典计数并删除不相关的值

问题描述

我正在做学校的工作,我一直在努力寻找解决方案。

我们被要求使用字典计算随机单词中的字母(比方说"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

标签: pythonpython-3.xdictionary

解决方案


首先,您没有正确地迭代字典的值。写作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

推荐阅读