使用原始输入删除Python列表元素
假设我有这样一个列表:
[['14632','apples'],
['134','oranges'],
['834','bananas'],
['472','tomatoes']]
我想在用户输入'oranges'作为函数的参数时,删除一个项目(比如说,['134', 'oranges'])。这是我目前的代码:
def remove_item(my_list, name):
name = raw_input()
for item in my_list:
if name == item[1]:
my_list.remove(item)
在这里,item[0]是数字,item[1]是字符串。这个代码没有成功,我觉得我在使用remove的时候缺少了什么,或者我使用'=='的方式不对?
2 个回答
0
你可以这样做:
def remove_item(my_list, name):
return [item for item in my_list if item[1] == name]
2
在循环一个列表的时候,如果你试图通过插入或删除元素来修改这个列表,通常是比较危险的。在Python中,如果你删除了当前的元素,for循环会跳过下一个元素。Python的手册建议在这种情况下,你应该遍历这个列表的一个副本。
摘自Python 3.1.3文档 - 复合语句 - 8.3 for
语句:
注意:当循环修改序列时,会有一些细微的地方需要注意(这只会发生在可变序列上,比如列表)。内部有一个计数器用来跟踪下一个要使用的元素,每次循环时这个计数器都会增加。当这个计数器达到序列的长度时,循环就会结束。这意味着如果在循环中删除了当前的(或之前的)元素,下一个元素就会被跳过(因为它会获取当前元素的索引,而这个元素已经被处理过了)。同样,如果在当前元素之前插入了一个新元素,下次循环时当前元素会再次被处理。这可能会导致一些难以发现的错误,而通过使用切片创建一个临时副本可以避免这些问题,例如:
for x in a[:]: if x < 0: a.remove(x)