如何基于另一个列表删除列表中的元素?

2024-09-28 21:00:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个名为“冰淇淋口味”的列表,还有两个名为“新口味”和“不可用”的列表。我想去掉“unavailable”中出现的调味品中的元素,并将新调味品中的元素添加到原来的调味品中。我写了以下程序:

for i in unavailable:
    icecream_flavours.remove(i)

for j in new_flavours:
    icecream_flavours.append(j)

append可以,但在程序的第一部分,它始终显示“ValueError:list.remove(x):x not in list”。有什么问题吗

谢谢


Tags: in程序元素列表newforremovelist
3条回答

这里有两种可能性

首先,也许在unavailable中不应该有任何不在icecream_flavours中的东西,但是,由于程序中其他地方的一些bug,这是不正确的。在这种情况下,您将需要调试首先出错的地方,无论是在调试器下运行还是在代码中添加print调用。无论如何,由于问题很可能出现在您在这里没有向我们展示的代码中,因此如果这就是问题所在,我们也无能为力

或者,也许某些东西出现在unavailable中是完全合理的,即使它不在icecream_flavours中,在这种情况下,您只想忽略它

这很容易做到,你只需要编写代码就可以了。正如^{}的文档所解释的,它:

raises ValueError when x is not found in s.

因此,如果要忽略在icecream_flavours中找不到i的情况,只需使用try/except

for i in unavailable:
    try:
        icecream_flavours.remove(i)
    except ValueError:
        # We already didn't have that one... which is fine
        pass

也就是说,有更好的方法来组织代码

首先,使用正确的数据结构总是使事情变得更容易。假设你不想要重复的口味,而且口味的顺序并不重要,你真正想要的是集合,而不是列表。如果你有集合,这将是微不足道的:

icecream_flavours -= unavailable
icecream_flavours |= new_flavours

即使你不能做到这一点,创建一个新的列表通常比在适当的地方修改列表要简单:

icecream_flavours = [flavour for flavour in icecream_flavours 
                     if flavour not in set(unavailable)]

(请注意,我将unavailable转换为一个集合,因此我们不必强制搜索列表中的每个味道。)

这些更改中的任何一个都会缩短代码,提高效率。但是,更重要的是,它们都使代码更容易推理,并且消除了出现错误的可能性,比如您正在尝试修复的错误

要添加所有不是unavailablenew_flavours,可以使用列表理解,然后使用+=操作符将其添加到现有的风格中

icecream_flavours += [i for i in new_flavours if i not in unavailable]

如果原始列表中已经有你想要删除的口味,你可以用同样的方法删除它们

icecream_flavours = [i for i in icecream_flavours if i not in unavailable]

如果首先要从icecream_flavours中删除所有不可用的口味,然后添加新的口味,可以使用以下列表:

icecream_flavours = [i for i in icecream_flavours if i not in unavailable] + new_flavours

相关问题 更多 >