2017-01-26 6 views
1

Задача:
Напишите программу, которая проверяет, является ли слово, предоставленное в качестве аргумента Isomet. Изограмма - это слово, в котором никакая буква не встречается более одного раза.Определение того, является ли строка Isogram

Создайте метод is_isogram, который принимает один аргумент, слово для проверки, является ли это изограммой. Этот метод должен возвращать кортеж слова и логическое значение, указывающее, является ли это изограммой.

Если аргумент представлен пустой строкой, верните аргумент и False: (аргумент, False). Если предоставленный аргумент не является строкой, поднимите TypeError с сообщением «Аргумент должен быть строкой».

Пример:

is_isogram("abolishment") 

Ожидаемый результат:

("abolishment", True) 

Видимый тест

from unittest import TestCase 

class IsogramTestCases(TestCase): 
    def test_checks_for_isograms(self): 
    word = 'abolishment' 
    self.assertEqual(
     is_isogram(word), 
     (word, True), 
     msg="Isogram word, '{}' not detected correctly".format(word) 
    ) 

    def test_returns_false_for_nonisograms(self): 
    word = 'alphabet' 
    self.assertEqual(
     is_isogram(word), 
     (word, False), 
     msg="Non isogram word, '{}' falsely detected".format(word) 
    ) 

    def test_it_only_accepts_strings(self): 
    with self.assertRaises(TypeError) as context: 
     is_isogram(2) 
     self.assertEqual(
     'Argument should be a string', 
     context.exception.message, 
     'String inputs allowed only' 
    ) 

Мое решение:

def is_isogram(word): 
    if type(word) != str: 
     raise TypeError('Argument should be a string') 

    elif word == "": 
     return (word, False) 
    else: 
     word = word.lower() 
     for char in word: 
      if word.count(char) > 1: 
       return (word, False) 
      else: 
       return (word, True) 

Но это функция отказывается пройти какой-то скрытый тест: что не так с моим решением? Есть ли еще один элегантный способ написания этой функции?

+1

'r eturn (word, True) 'должен находиться вне цикла' for'. –

+0

Пожалуйста, исправьте свой отступ в фрагменте кода – Sayse

+0

Хотя это не вне темы, вы можете найти более конструктивную обратную связь по обзору кода SE (codereview.stackexchange.com) (поскольку ваш код работает в основном и только если не считать того, что предположительно является краевым случаем). – Jules

ответ

3

Я не уверен, что ваш поиск должен быть чувствителен к регистру, так, возможно, вы должны удалить word = word.lower(), но ваш главный вопрос return завершает функцию, чтобы вы текущий код должен только return True после всех испытаний были проведены (т.е. вне цикл):

for char in word: 
    if word.count(char) > 1: 
     return (word, False) 
return (word, True) 

Во всяком случае, лучший способ заключается в использовании set(), чтобы удалить все дубликаты из вашей строки, а затем сравните длину; также используйте isinstance(), чтобы проверить, является ли строка word. Вы можете использовать if w для проверки пустых строк. Вам не нужно круглые скобки с return, запятая достаточно return кортеж:

def is_isogram(word): 
    if isinstance(word,str): 
     w = word.lower() # assuming you want a case in-sensitive search 
     return word, len(w) == len(set(w)) if w else False 
    else: 
     raise TypeError('Argument should be a string') 

Примеры:

is_isogram('abolishment') 
# ('abolishment', True) 
is_isogram('happy') 
# ('happy', False) 
is_isogram('') 
# ('', False) 
is_isogram(1) 
# TypeError: Argument should be a string 
-1

Вам просто нужно дополнительное условное выражение, чтобы проверить, если символы в слове только алфавиты (т.е. нет цифр или символов), в то время как проверка, если символы повторяются:

def is_isogram(word): 
    if type(word) != str: 
     raise TypeError("Argument should be a string") 
    if len(word) < 1: 
     return (word, False) 
    word = word.lower() 

    for char in word: 
     if word.count(char) > 1 or \ 
     char not in "abcdefghijklmnopqrstuvwxyz": # this checks that the char is an alphabet 
      return (word, False) 
    return (word, True) 

Я думаю, это должно помочь.

0

Вот один из способов решить эту проблему:

def is_isogram(argument): 
    word_seen=set() 
    if type(argument) != str: 
    raise TypeError('Argument should be a string') 
    if argument==" " : 
    return(argument,False) 
    argument.lower() 
    for letter in argument: 
    if letter in word_seen: 
     return(argument,False) 
    word_seen.add(letter) 
    return (argument,True) 

Эквивалентно, я также попытался следующие, чтобы удалить все пробелы в строках:

def is_isogram(argument): 
    word_seen=set() 
    if type(argument) != str: 
    raise TypeError('Argument should be a string') 
    if argument==" " : 
    return(argument,False) 
    argument.lower() 
    argument = ''.join(argument.split()) 
    for letter in argument: 
    if letter in word_seen: 
     return(argument,False) 
    word_seen.add(letter) 
    return (argument,True) 
2

Я попытался таким образом:

def isogram(n): 
if not isinstance(n, str): 
    return n,False 
elif len(n) < 1: 
    return n,False 
n = n.lower() 
if len(n) == len(set(n)): 
    return n,True 
else: 
    return n,False 
  • Вторая строка проверяет, является ли вход n строка, если она не возвращает False.
  • Строка 4 проверяет, является ли длина ввода меньше 1, в этом случае вход пуст, и мы не можем проверить, является ли это изограммой или нет.
  • 'n = n.lower()' в строке 6 заверяет нас, что ввод становится строкой с строчными буквами.
  • В строке 7 мы проверяем, равна ли длина ввода длине набора (n). Функция set() преобразует коллекцию или последовательность или объект итератора в набор. Например: set ('lists') возвращает {'s', 't', 'l', 'i'}, поскольку вы можете видеть букву ', которая дважды появляется в' списках ', не отображается в задавать. Это полезно для проверки того, равна ли длина набора равным длине ввода, если есть буква, которая дважды появляется на входе, условие False.

Надеюсь, это объяснение упростит сценарий.

+0

комментарии к тому, что будет делать код – Qchmqs

+0

Я отредактировал свой комментарий выше, добавив некоторые объяснения. Надеюсь, это поможет вам. @Qchmqs –

+0

Я уже понял это tho, но с лучшим ответом на качество хорошо для всех – Qchmqs

-1

я нашел правильный

 
    def is_isogram(word):
if type(word)!=str: raise TypeError("Argument should be a String") elif word.strip()=="": return(word,False) else: word =word.lower() for char in word: if word.count(char) >1: return (word ,False) else: return(word ,True)

+0

Пожалуйста, подумайте над добавлением текста .. В чем разница, ..? – Finduilas

0

я решил его здесь:

Защиту is_isogram (слово):

for letter in word: 
    if word.count(letter) > 1: 
     return False 
else: 
    return True 

печати is_isogram ("Hello")

0
def is_Isogram(words): 
cover_words = words.lower() 

letter_list = [] 

for letter in cover_words: 
    if letter.isalpha(): 
     if letter in letter_list: 
      return False 
     letter_list.append(letter) 
return True 

if __name__ == '__main__': 
     print(is_Isogram('Machine')) 
     print(is_Isogram('Geeks'))` 
0
def is_isogram(string): 
    if type(string) != str: 
     raise TypeError('Argument should be a string') 
    elif string == " ": 
     return (string, False) 
    else: 
     for i in string: 
      if string.count(i) > 1: 
       return (string, False) 
    return (string, True) 
+1

Пожалуйста, добавьте объяснение того, как реализовать и использовать код выше –

Смежные вопросы