我有两个数组,如果一个元素存在于从客户端接收的数组中,那么它应该删除另一个数组中的匹配数组。这在客户端数组只有一个元素时有效,但在有多个元素时却无效。
这是代码:
projects = ['xmas','easter','mayday','newyear','vacation']
for i in self.get_arguments('del[]'):
try:
if i in projects:
print 'PROJECTS', projects
print 'DEL', self.get_arguments('del[]')
projects.remove(i)
except ValueError:
pass
self.get_arguments('del[]')
,从客户端返回一个数组格式为:
[u'xmas , newyear, mayday']
所以它读作一个元素而不是3个元素,因为只有一个unicode存在。
如何删除多个元素?
编辑:我必须将列表变成一个包含多个单独元素的列表。
答案 0 :(得分:4)
filter
怎么样?
projects = filter(lambda a: a not in self.get_arguments('del[]'), projects)
答案 1 :(得分:3)
可以尝试像列表理解那样的超级pythonic:
new_list = [i for i in projects if i not in array_two]
你必须写下原始项目,这不是最优雅的,但这应该有用。
答案 2 :(得分:2)
这不起作用的原因是remove
只删除匹配的第一个元素。您可以通过反复调用remove
直到它不再存在来解决问题 - 例如,将if
更改为while
,如下所示:< / p>
while i in projects:
print 'PROJECTS', projects
print 'DEL', self.get_arguments('del[]')
projects.remove(i)
但总的来说,使用remove
是一个坏主意 - 特别是当你已经搜索过该元素时。现在,您只是重复搜索,以便将其删除。除了显而易见的低效率之外,在很多情况下,您最终会尝试删除i
的第三个实例(因为这是您找到的那个)但实际上却删除了第一个实例。它只是让你的代码更难以推理。您可以通过迭代列表一次并随时删除来提高复杂性和效率。
但即使这样过于复杂 - 而且仍然效率低下,因为每次从列表中删除时,都会移动列表中的所有其他元素。使用filter
或列表理解从您想要保留的值构建新列表几乎总是更简单:
arguments = set(self.get_arguments('del[]'))
projects = [project for project in projects if project not in arguments]
将arguments
置于集合中并不是必需,但它在概念上更清晰 - 您不关心参数的顺序,或者需要保留任何重复项 - 和它更高效 - 集合可以立即测试成员资格,而不是通过与每个元素进行比较。