我正在python中创建一条命令,该命令接收一条消息并将其转换为列表,然后删除前5个字母(!calc)。之后,它将检查列表中的每个项目是字母还是空格。如果是,则将其从列表中删除。
换句话说,如果它收到消息“!calc abcdef”,我希望它显示“ []”(什么都没有)。
相反,我得到了[['a','c','e']
message = "!calc abcdef"
if message.startswith("!calc"): #checks if the message starts with !calc
msg = list(message)
del msg[0:5] #deletes the !calc part
for i in msg: #goes through each item [" ", "a", "b", "c", "d", "e", "f"]
if (i.isalpha()) == True: #checks if the item is a letter
msg.remove(i) #removes the letter
elif (i.isspace()) == True: #checks if the item is a space
msg.remove(i) #removes the space
print(msg)
答案 0 :(得分:3)
出现问题是因为在遍历列表时删除列表中的项目。当您执行for i in msg
时,实际上可能会跳过一些元素。观察这段代码:
L = [1, 2, 3, 4, 5]
for i in L:
print(i)
if i % 2 == 0:
L.remove(i)
您可能希望print
语句将打印所有五个元素1..5,但实际上它会打印:
1
2
4
要解决此问题,您可以向后遍历数组,或使用列表推导:
msg = [i for i in msg if i.isalpha() == False or i.isspace() == False]
当然,还可以使用以下语法在一定程度上清理整个代码:
message = ''.join([i for i in message[:5] if not i.isalpha() and not i.isspace()])