Python一直在AttributeError: 'str' object has no attribute 'pop'
行上给我一个“Words[Check0n].pop()
”。
最初,我试图通过将Check
和Check0
转换为int
并将Checkn
和Check0n
等同于此来解决此问题。
由于这不起作用,我使用Check0n
两次检查int
的值是否为print(type(Check0n) is int)
。两个都打印True
,所以我真的不明白为什么它会一直给出同样的错误,如果Check0n
是一个字符串,它显然不是。
我希望程序做的是测试列表中的“a”。然后,它应该在列表的下一个位置测试“事物”。如果那里有“东西”,那么它应该从列表中的那个位置删除“东西”,并用“一个东西”替换前一个位置中的“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")
请注意,该程序对我来说很重要,可以粘贴整个程序。
答案 0 :(得分:0)
“......如果Check0n
是一个字符串,它会一直给出同样的错误......”
不,不是。如果Words[Check0n]
是一个字符串,那么它会给你一个错误。 Words
是一个字符串列表,Words[Check0n]
就是其中之一。
您可以通过拆分问题行来证明这一点:
Words[Check0n].pop()
......分为两个:
oops = Words[Check0n]
print(repr(oops))
oops.pop()
第一行和第二行可以正常工作,您会看到oops
是字符串'thing'
。然后,您将获得与以前相同的AttributeError
,但它会抱怨oops.pop()
行。
您的代码还有其他问题:
你正在从一个集合中删除项目,而“for-each”迭代它,这总是很棘手。这很难说,因为有很多事情在变化。
你的功能做了太多事情,很难说出实际的bug在哪里。至少考虑三个功能:
get_sentence_from_user()
返回一个字符串。
prep_sentence(sentence)
摆弄,
和.
个字符,并返回生成的“预备”字符串。
使用字符串的split
方法将其拆分为单词列表。 (不需要自己写这个。)
merge_words(words)
通过一次附加一个单词来构建新列表,任何'a', 'thing'
出现的单词都合并到单个元素'a thing'
中。它返回新的,可能更短的列表。
如评论中所述,如果您确实要修改输入列表,则pop
方法会删除最右边的元素。要删除其他元素,必须为其提供该元素的整数索引。 (顺便说一下,如果你担心的话,这很可能比建立一个新的输出列表更慢。)
当您找到单词'a'
时,您会立即开始处理列表中的下一个单词,而不会验证是下一个单词。这会引发IndexError
...有时。