2015-11-21 2 views
-2

Python продолжает давать мне «AttributeError: 'str' object has no attribute 'pop'» на линии Words[Check0n].pop().Переменная должна быть int, но AttributeError утверждает, что это str

Изначально я пытался решить эту проблему путем поворота Check и Check0 в int с и сравнявшись Checkn и Check0n тем.

Так как это не сработало, я проверил, было ли значение Check0n равным int, используя print(type(Check0n) is int) дважды. Оба печатаются True, поэтому я действительно не понимаю, почему он продолжает давать ту же ошибку, что и если бы Check0n были строкой, когда это явно не так.

Что я хочу, чтобы программа выполняла проверку «a» внутри списка. Затем он должен проверить «вещь» в следующем месте в списке. Если «вещь» есть, тогда она должна удалить «вещь» из этого места в списке и заменить «а» на прежнем месте «вещью». Если бы вы написали «материал», я бы хотел, чтобы они оставались разделенными в списке как «a», «stuff».

def Sentence_Processing(): 
    Sentence = input("Enter a sentence:") 
    Sentence_0 = Sentence.replace(".", " .") 
    Sentence_1 = Sentence_0.replace(",", " ,") 
    Words = Sentence_1.split() 
    print(Words) 
    for Word in Words: 
     Word0 = str.lower(Word) 
     if Word0 == "a": 
      Check = Words.index(Word) 
      Check0 = Check+1 
      Checkn = int(Check) 
      Check0n = int(Check0) 
      print(type(Check0n) is int) 
      if Words[Check0n] == "thing": 
       print(type(Check0n) is int) 
       Words[Check0n].pop() 
       Words[Checkn] = "a thing" 
       print("Did all of it") 
      print("Passed") 

Обратите внимание, что программа для меня большая, чтобы вставить всю вещь.

+1

Слова [Check0n] является строка, строка не имеет метод поп –

+0

Если вы пытаетесь удалить элемент из списка слов можно сделать Words.pop () – junnytony

+0

@Pawel Kordowski Сообщение об ошибке почти записано это. –

ответ

0

«... она продолжает давать ту же ошибку, что дало бы, если Check0n была строка ...»

Нет это не так. Это дает вам ошибку, которую вы получили бы, если бы Words[Check0n] были строкой ... какой она есть. Words - это список строк, а Words[Check0n] - один из них.

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

Words[Check0n].pop() 

... надвое:

oops = Words[Check0n] 
print(repr(oops)) 
oops.pop() 

Первый и второй линии будет работать нормально, и вы увидите, что oops строка 'thing'. Тогда вы получите тот же AttributeError, как и прежде, за исключением того, что он будет жаловаться на линию oops.pop().

Ваш код имеет другие проблемы:

  1. Вы удаляете элементы из коллекции в то время как «для-каждого» итерации над ним, что всегда сложно. Трудно рассуждать, потому что сразу несколько вещей меняются.

  2. Ваша функция делает слишком много вещей, из-за чего трудно определить, где находятся настоящие ошибки. Рассмотрим как минимум три функции:

    • get_sentence_from_user() возвращает строку.

    • prep_sentence(sentence) fiddles с символами , и . и возвращает полученную «подготовленную» строку.

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

    • merge_words(words)строит новый список путем добавления одного слова в то время, с любыми вхождений 'a', 'thing' слиты в единый элемент 'a thing'. Он возвращает новый, возможно, более короткий список.

  3. Как было отмечено в комментариях, если вы действительно хотите изменить список ввода, это pop метод удаляет крайний правый элемент. Чтобы удалить какой-либо другой элемент, вы должны указать ему целочисленный индекс этого элемента. (Это, кстати, весьма вероятно, будет медленнее чем строить новый список вывода, в случае, если вы беспокоитесь об этом.)

  4. Когда вы найдете слово 'a', вы сразу же приступить к работе на следующий слово в списке, не подтверждая, что там - это следующее слово. Это поднимет IndexError ... иногда.

+0

Спасибо, что ответили (Ненавижу, как публикуются комментарии при вводе ...) Я работал над этим кодом и улучшал его, вещь Words.pop () действительно помогла мне. То, что вы сказали в 3, было тем, что я пытался сделать, это приводило к ошибкам. –

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