Создайте функцию, которая содержит только первое вхождение буквы из исходной фразы - PullRequest
0 голосов
/ 17 октября 2018

Функция должна работать следующим образом: enter image description here

Первая буква может быть прописной или строчной (newPhrase).Не-буквенные символы - остаются без изменений.

До сих пор я думал о:

def keepFirstLetter(phrase):
'''Returns a new string that contains only the first occurrence of a 
letter from the original phrase. 

    letterSeenSoFar = ''
    newPhrase = ''
    if (letterSeenSoFar == '' or letterSeenSoFar[-1] != letterSeenSoFar):
         letterSeenSoFar += c
    for letter in letterSeenSoFar:
        if letter.isalpha:
            newPhrase += char
        else:
            newPhrase += letter
    return newPhrase

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Мое имя было в вопросе, поэтому позвольте мне попробовать.Я узнал set.add () от Джеймса впервые.(Спасибо, Джеймс.) Код Джеймса короче и работает быстрее (3.48us против 3.76us на моем ПК).

def keepFirstLetter(phrase):
    phrase = list(phrase)
    '''Returns a new string that contains only the first occurrence of a 
    letter from the original phrase.'''
    letterSeenSoFar = []
    newPhrase = ''
    for char in phrase:
        # if char is not an alphabet, add char to the newPhrase as is
        if not char.isalpha():
            newPhrase += char
        # if char is an alphabet and not seen so far, add char to the newPhrase and append it to letterSeenSoFar
        elif char.lower() not in letterSeenSoFar:
            letterSeenSoFar.append(char.lower())
            newPhrase += char
    return newPhrase

print(keepFirstLetter('Amy says, " Me?"'))

Это выводит:

Amy s, " e?"
0 голосов
/ 17 октября 2018

Самое простое, надежное для изучения решение, вероятно, выглядит так:

def keepFirstLetter(phrase):
    output = ''
    for letter in phrase:
        if (letter.lower() not in output.lower()) or (not letter.isalpha()):
            output += letter

    return output

print(keepFirstLetter('Amy says, "Me?"'))       #  Amy s, "e?"

(скобки вокруг двух, если условия являются необязательными)

Решение Джеймса все еще получает мой голосхотя.

0 голосов
/ 17 октября 2018

Вы, кажется, на правильном пути.Если вы хотите повысить свою эффективность, вы можете хранить увиденные буквы в виде набора.Поиск набора O (1).

def unique_first(s):
    letters = set()
    out = ''
    for x in s:
        if not x.isalpha():
            out += x
            continue
        if not x.lower() in letters:
            out += x
            letters.add(x.lower())
    return out
...