你好,我有下面的代码,但它没有按预期工作,我看不到我犯了错误,我使用python 3,missing_letters方法没有按预期工作,因为第二个输出是错误的,我需要它采取一个输入并使用字母串作为比较返回缺失的字母
alphabet = "abcdefghijklmnopqrstuvwxyz" test_miss = ["zzz","subdermatoglyphic","the quick brown fox jumps over the def missing_letters(string): compare = histogram(string) for key in sorted(compare): if key in alphabet: result = alphabet.replace(key,'') return result # print result else: return None for letters in test_miss: if missing_letters(letters) == None: print(letters, 'uses all the letters') else: print(letters , 'is missing letters', missing_letters(letters)) # output: zzz is missing letters abcdefghijklmnopqrstuvwxy # subdermatoglyphic is missing letters bcdefghijklmnopqrstuvwxyz # the quick brown fox jumps over the lazy dog uses all the letters
你的方法'def missing_letters(string):'是错误的。我已经纠正了它,以下代码/方法将起作用,尝试一下
alphabet = "abcdefghijklmnopqrstuvwxyz"
test_miss = ["zzz","subdermatoglyphic","the quick brown fox jumps over the lazy dog"]
def missing_letters(string):
result = alphabet
compare = set(string)# use histogram to make a dictionary
compare=sorted(compare)
for key in compare: # iterate and sort in alphabetical order
if key in alphabet: # check if the key in alphabet
result = result.replace(key,'')# remove it from alphabet
return result
# Test the function
print(missing_letters("ab")) # output: bcdefghijklmnopqrstuvwxyz
##### test_miss for loop #####
for letters in test_miss:
if len( missing_letters(letters) ) == 0:
print(letters, 'uses all the letters')
else:
print(letters , 'is missing letters', missing_letters(letters))
# output: zzz is missing letters abcdefghijklmnopqrstuvwxy
# subdermatoglyphic is missing letters bcdefghijklmnopqrstuvwxyz
# the quick brown fox jumps over the lazy dog uses all the letters
你不需要计算字母的数量,你可以直接使用一个集合(你的输入string
每个字母只会出现一次)。一旦你有了这个集合,你就可以从字母表中减去这个集合,你最终得到一个包含缺失字母的集合:
from string import ascii_lowercase
alphabet = set(ascii_lowercase)
def missing_letters(string):
return alphabet - set(string.lower())
print(missing_letters("abcdefghijklmnopqrstuv"))
将输出{'w', 'y', 'x', 'z'}
。请注意,ascii_lowercase
只是一个包含所有小写字母的字符串。
主要的问题是你在循环内部return
,即在检查了第一个字母之后。此外,似乎你正在迭代单词中的字母,并检查它们是否在字母表中,而不是相反,这将产生更多的senes。此外,似乎没有必要创建字母频率的直方图。
你可以尝试这样的事情:
def missing_letters(string):
missing = []
for key in alphabet:
if key not in string:
missing.append(key)
return ''.join(missing) or None
或者你可以将字母和字符串转换为set
并使用set difference -
:
def missing_letters(string):
return ''.join(sorted(set(alphabet) - set(string))) or None
使用集合进行成员资格测试:首先使alphabet
成为一组
In [10]: alphabet = "abcdefghijklmnopqrstuvwxyz"
In [11]: alphabet = set(alphabet)
对于字符串'ab'`直方图返回
In [12]: compare = {'a':1,'b':1}
使用set方法确定差异
In [13]: alphabet.difference(compare.keys())
Out[13]:
{'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z'}