2016-12-20 3 views
1

Ввод - это список, последовательно нижний или верхний. В пределах последовательности, при правильной сортировке, одна буква отсутствует. Функция должна возвращать недостающую букву в виде строкового вывода. См. Код ниже, где вы заметите, что я на полпути, рассчитав недостающую букву только для строчных списков.Поиск отсутствующего письма в списке (в нижнем регистре или в верхнем регистре, исключительно)

import string 
def find_missing_letter(chars): 
    for letter in string.ascii_lowercase: 
     if letter not in chars: 
      return letter[0] 

Тестовые примеры:

test.assert_equals(find_missing_letter(['a','b','c','d','f']), 'e') 
test.assert_equals(find_missing_letter(['O','Q','R','S']), 'P') 

Любой знает, как проверить, независимо от регистра букв ??

+0

Вы не наполовину сделано - это не работает должным образом для нижнего регистра либо , – wim

ответ

1

2 изменения необходимы для вашей спецификации:

  1. Определите кодировку, проверяя тип букв chars содержит.

  2. Начните проверку с символа, который является главой chars - таким образом chacking для b, c, e приведет к d и не a.

должен идти, как:

def find_missing_letter(chars): 
    charset = string.ascii_lowercase if chars[0] >= 'a' else string.ascii_uppercase 
    for letter in charset[charset.index(chars[0]):]: 
     if letter not in chars: 
      return letter[0] 
+0

отличное спасибо –

1

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

def missing_elements(L): 
    start, end = L[0], L[-1] 
    return sorted(set(range(start, end + 1)).difference(L)) 

def find_missing_letter(chars): 
    numbers = list(map(ord, chars)) 
    n = missing_elements(numbers) 
    return chr(n[0]) 

Тестовый пример:

chars = ['a','b', 'd'] 
print(find_missing_letter(chars)) 

Выход:

с

+0

+1! Хороший трюк. Но почему вы использовали цифры? Вы можете использовать письма напрямую. set() не ограничивается числами. – Dalen

+0

Это потому, что я использую диапазон, чтобы получить все последовательные значения. И я ценю верхнюю часть. : D –

+0

Да-да, но вам не нужно было делать это с помощью range(). Я не прав. Кроме того, вы уверены, что включили все нижние и верхние регионы таким образом? Вы использовали начало и конец, но что, если ввод не отсортирован? Что делать, если он отсортирован в порядке возрастания? – Dalen

0

import string 

def find_missing (txt): 
    """Takes string or other type of iterable containing letters. 
    Returns a list of all letters that aren't present in the input string/iterable. 
    Missing letters are returned as lower case. 
    """ 
    txt = (x.lower() for x in txt if x.isalpha()) # Generator object 
    found = dict.fromkeys(string.ascii_lowercase, 0) 
    for x in txt: found[x] = 1 
    return [x for x in found if found[x]==0] 

+0

Это делает только один проход через все символы + полтора через все ascii. Ваш путь проходит через все ascii и снова и снова через все символы. Каждый раз, когда письмо не находится в символах, все символы пересекаются, и всегда некоторые из них. Я говорю об операторе. Когда вы говорите «» в списке ([]) в итерации по iterable, чтобы проверить, есть ли «» или нет. Итак, мой код должен быть немного быстрее для больших символов, где письма могут много повторять. – Dalen

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