假设我有一个名为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不在列表中'对于该计划的第一部分。问题是什么?
感谢
答案 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
转换为集合,因此我们不必对列表中的每种风格进行暴力搜索。)
这些更改中的任何一个都会使代码更短,并使其更有效。但是,更重要的是,它们都使代码更易于推理,并消除了您尝试修复的错误的可能性。