Почему этот список не работает ... "Ошибка типа: индексы списка должны быть целыми или кусочками, а не str" - PullRequest
0 голосов
/ 23 сентября 2018

Я новичок в Python и делаю вступительный проект.Может кто-нибудь сказать мне, почему это не работает / как это исправить.По сути, пользователь дает список слов, и если слово не множественное число, он должен добавить «s».Но это не работает ... вот код.Я ценю любые отзывы.Большое вам спасибо.

def pluralize_words():

#########################################################
#Checks if words in plural_words are indeed plural and corrects them if not##
#########################################################

    global singular_words
    global plural_words

    for i in plural_words:
        if plural_words[i].endswith("s"):
            word_is_plural = True
        else:
            word_is_plural = False
            plural_words[i] = word + "s"

    print(plural_words)

Ответы [ 4 ]

0 голосов
/ 23 сентября 2018

Если plural_words - это список слов, то i - это слово (не целое число; имя переменной i обычно используется с целыми числами в циклах while; в Python для циклов обычно нетпеременная счетчика, но они будут давать вам сам элемент списка на каждой итерации, а не номер элемента).Вы должны проверить, заканчивается ли i на s (а не заканчивается на plural_words[i] на s).

Чтобы исправить код, вы можете сделать что-то вроде этого (и хотя это не самый эффективный или лучший метод,он должен продемонстрировать, почему ваш код не работает, и что вам нужно сделать, чтобы он работал с вашей методологией):

def pluralize_words():
    global singular_words
    global plural_word

    i=0
    for word in plural_words:
        if word.endswith("s"):
            word_is_plural = True
        else:
            word_is_plural = False
            plural_words[i] = word + "s"
        i+=1

    print(plural_words)
0 голосов
/ 23 сентября 2018

Стивен и U9 дали отличные решения.Я объясню, почему ваш код не работает.Обратите внимание, что множественные слова представляют собой список строк.Поэтому, когда вы вызываете for i in plural_words:, вы перебираете слова в этом списке, и, таким образом, на каждой итерации вы получаете саму строку (а не число).Например:

Входные данные:

plural_words = ['bark','dog','cats']
for i in plural_words:
    print(i)

Выходные данные:

bark
dog
cats

Поскольку на каждой итерации вы устанавливаете свой i как строку из списка, он неимеет смысл вызывать элемент списка, используя эту строку в качестве индекса (поскольку списки могут иметь только целочисленные индексы).Если бы я запустил ваш код выше, используя мой пример списка множественных слов, первая итерация, которую я бы назвал, - это множественное_слово ['bark'], которое даст мне конкретную ошибку, которую вы только что получили.Чтобы обойти эту проблему, вы можете использовать перечисление, как упомянуто в U9, или вы можете выполнять итерацию по всему диапазону длины вашего списка (так что я буду числом).Вот пример:

Ввод:

plural_words = ['bark','dog','cats']
for i in range(len(plural_words)):
    print('i:', i)
    print('word:', plural_words[i])

Выход:

i: 0
word: bark
i: 1
word: dog
i: 2
word: cats

В этом случае len(plural_words) равен 3, так что вы на самом деле for i in range(3).

0 голосов
/ 23 сентября 2018

Это хорошее место для понимания списка, мы можем использовать endswith('s'), чтобы сделать наши эвакуации

words = ['sings', 'dance', 'runs', 'hides']

plural = [i if i.endswith('s') else i + 's' for i in words]
chrx@chrx:~/python/stackoverflow/9.22$ python3.7 uk.py
['sings', 'dances', 'runs', 'hides']
0 голосов
/ 23 сентября 2018

Нужно enumerate:

def pluralize_words():
    global singular_words
    global plural_words

    for idx,i in enumerate(plural_words):
        if i.endswith("s"):
            word_is_plural = True
        else:
            word_is_plural = False
            plural_words[idx] = i + "s"

    print(plural_words)    

Лучше:

plural_words=[i if i[-1]!='s' else i+'s' for i in plural_words]

Или:

plural_words=list(map(lambda x: x+'s' if x[-1]!='s' else x,plural_words))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...