基本上,我在从列表中删除项目时遇到问题。 我想通过一个变量来做到这一点,就像这样:
my_list = ["cat","dog","duck","horse","snake"]
import random
animal=(random.choice(my_list))
new_list = []
new_list.append(my_list)
new_list.remove(animal)
print(new_list)
我得到这个: ValueError:list.remove(x):x不在列表中
你们会推荐我什么?
答案 0 :(得分:1)
您从列表中选择了一个随机项目,然后将整个旧列表作为单个元素添加到新列表中。这将创建一个二维列表,该列表在最外面的列表中不包含任何字符串值。
调试此操作的最佳方法是在应用删除操作之前打印列表以查看其内容:
print(new_list) # => [['cat', 'dog', 'duck', 'horse', 'snake']]
您是否注意到多余的[[]]
?那是一个嵌套列表。
同样,您的目的是复制列表(使用slice运算符在此处完成):
my_list = ["cat","dog","duck","horse","snake"]
import random
animal=(random.choice(my_list))
new_list = my_list[:]
new_list.remove(animal)
print(new_list)
除此之外,优良作法是包含空格,删除不必要的括号并将导入内容放在文件顶部。
最后,remove
是一个线性操作,它可能会查看列表中的每个元素以查找要删除的元素。这似乎很愚蠢,但是当您开始处理成千上万个项目的列表时,不必要地遍历列表将成为一个巨大的问题。
尝试使用pop
和random.randint
来选择一个索引并将其从列表中删除一次(您仍然会因移动列表成员来填补空白而受到惩罚;将其从列表中删除)列表的中间位置并不理想):
import random
my_list = ["cat", "dog", "duck", "horse", "snake"]
new_list = my_list[:]
new_list.pop(random.randint(0, len(my_list) - 1))
print(new_list)
答案 1 :(得分:0)
以上答案已足够。但是,我要指出的是,您可以使用另一种方式调试代码,即:
import pdb
并调用您的函数:
pdb.set_trace()
这基本上使您可以在调用堆栈帧处进入调试器。我发现它更加足智多谋。