如何根据另一个列表删除列表中的元素?

时间:2014-10-20 22:50:21

标签: python list append

假设我有一个名为icecream_flavours的列表,以及两个名为new_flavours且不可用的列表。我想删除“不可用”中出现的各种元素,并将new_flavours中的元素添加到原始元素中。我写了以下程序:

for i in unavailable:
    icecream_flavours.remove(i)

for j in new_flavours:
    icecream_flavours.append(j)

追加一个很好,但它一直显示' ValueError:list.remove(x):x不在列表中'对于该计划的第一部分。问题是什么?

感谢

4 个答案:

答案 0 :(得分:1)

要添加非new_flavours的所有unavailable,您可以使用列表推导,然后使用+=运算符将其添加到现有的口味中。

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]

答案 1 :(得分:1)

如果您首先要从icecream_flavours删除所有不可用的风味,然后添加新的风格,您可以使用此列表理解:

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

答案 2 :(得分:1)

导致您的错误,因为unavailable包含不在icecream_flavours中的风格。

除非订单很重要,否则您可以使用set代替list,因为他们有差异和工会的操作,您不必担心重复

如果必须使用列表,列表推导是筛选列表的更好方法

icecream_flavours = [x for x in icecream_flavours if x not in unavaiable]

您可以扩展这样的风格列表

icecream_flavours += new_flavours

假设没有重复。

答案 3 :(得分:1)

这里有两种可能性。

首先,也许unavailable中的任何内容都不应该出现在icecream_flavours中,但是,由于程序中某些错误其他,这不是真正。在这种情况下,您将需要调试首先出错的地方,无论是在调试器下运行还是在代码中添加print调用。无论如何,由于这个问题最有可能发生在你没有在这里展示给我们的代码中,如果这就是问题,我们就无能为力。

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

这很容易做到,你只需要编写执行它的代码。正如list.remove的文档所解释的那样:

  在ValueError找不到x

s

因此,如果您想忽略在i中找不到icecream_flavours的情况,请使用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转换为集合,因此我们不必对列表中的每种风格进行暴力搜索。)

这些更改中的任何一个都会使代码更短,并使其更有效。但是,更重要的是,它们都使代码更易于推理,并消除了您尝试修复的错误的可能性。