使用原始输入删除Python列表元素

1 投票
2 回答
1632 浏览
提问于 2025-04-18 01:39

假设我有这样一个列表:

[['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)

撰写回答