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