Метод отсутствующих букв с помощью python - PullRequest
0 голосов
/ 20 марта 2019

Здравствуйте, у меня есть код ниже, но он работает не так, как ожидалось, я не вижу, где я допустил ошибку, я использую 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
            

Ответы [ 4 ]

1 голос
/ 20 марта 2019

Вам не нужно считать количество букв, вы можете напрямую использовать набор (который будет иметь только один случай каждой буквы из вашего ввода 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 просто строка, содержащая все строчные буквы.

0 голосов
/ 20 марта 2019

Ваш метод '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
0 голосов
/ 20 марта 2019

Используйте наборы для тестирования членства: сначала сделайте alphabet набор

In [10]: alphabet = "abcdefghijklmnopqrstuvwxyz"

In [11]: alphabet = set(alphabet)

Для строки 'ab' гистограмма возвращает

In [12]: compare = {'a':1,'b':1}

Используйте набор методов, чтобы определить разницу

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'}
0 голосов
/ 20 марта 2019

Основная проблема в том, что вы return внутри цикла, т.е. после проверки самой первой буквы.Кроме того, кажется, что вы перебираете буквы в слове и проверяете, есть ли они в алфавите, а не наоборот, что принесло бы больше смысла.Кроме того, кажется ненужным создавать гистограмму буквенных частот.

Вы можете попробовать что-то вроде этого:

def missing_letters(string):
    missing = []
    for key in alphabet:
        if key not in string:
            missing.append(key)
    return ''.join(missing) or None

Или вы можете преобразовать и алфавит, и строку в set ииспользуйте разницу набора -:

def missing_letters(string):
    return ''.join(sorted(set(alphabet) - set(string))) or None
...