Pluralize в Python без функции множественного числа - PullRequest
0 голосов
/ 01 марта 2020

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

  • , если слово оканчивается на 'y', перед которым стоит гласная (a, e, i, o, u), добавьте 's'; например, обезьяна -> обезьяны
  • , если слово оканчивается на «у» без предшествующей гласной, удалите «у» и добавьте «и», например, fly -> летит
  • , если слово оканчивается на 'o', 'ch', 's', 'sh', 'x' или 'z', затем добавьте 'es' в противном случае, просто добавьте 's'

Для Например, если пользователь вводит: «кнопка мухи крыльца обезьяны-слона картофеля fi sh лиса жужжит», то вывод должен быть следующим: «обезьяны-слоны картошки крыльца мухи кнопки рыба лисицы жужжит»

Вот что у меня есть до сих пор :

#Ask for user input
word = input("What would you like to convert to plural?: ")

#Separate words in input into list
splitstring = word.split()
conversionlist = list(splitstring)
##list check
#print(conversionlist)


def plural(splitstring):
    #For every single word in string
    for split in conversionlist:
        #If vowel before y (endswith only takes 3 arguements)
        if split.endswith('ay','ey','iy') or split.endswith('oy','uy'):
            return split + 's'
        #If not a vowel before y
        if split.endswith('y') and not (split.endswith('ay','ey','iy') or split.endswith('oy','uy')):
            #Remove the y and append the appropriate ending
            return split[:-1] + 'ies'
        #o, ch, s, sh, x, or z endings
        if split.endswith('o') or split.endswith('ch') or split.endswith('s') or split.endswith('sh') or split.endswith('x') or split.endswith('z'):
            return split + 'es'
        #general case
        else:
            return split + 's'

plural(splitstring)

#Append all converted plurals into singular list and print output
totalplural = " ".join(plural(splitstring))
print(totalplural)

Прямо сейчас я получаю «Ошибка TypeEr: индексы среза должны быть целыми числами или None или иметь index метод» в строке 25. Любые мысли о том, как я мог бы изменить код, чтобы заставить его делать то, что я хочу?

1 Ответ

0 голосов
/ 01 марта 2020

Вы не можете сделать:

split.endswith('ay','ey','iy')

Метод endswith принимает только один строковый аргумент, за которым могут следовать индексы start и end. Вместо этого вы можете проверить каждый суффикс отдельно или вы можете избежать endswith и вместо этого сделать:

split[-2:] in ('ay', 'ey', 'iy')

, который будет делать то, что вы хотите.

Обновление: вы можете имеет endswith проверку на наличие нескольких суффиксов одновременно, если вы передаете tuple для первого аргумента. Поэтому лучший способ сделать это:

split.endswith(('ay','ey','iy'))

Дополнительные скобки создают tuple, который передается как первый (и единственный) аргумент endswith. Это ближе к тому, что вы хотели сделать в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...