如果在另一个列表中,Python将删除列表中的多个元素

时间:2014-11-11 19:06:12

标签: python python-2.7

我有两个数组,如果一个元素存在于从客户端接收的数组中,那么它应该删除另一个数组中的匹配数组。这在客户端数组只有一个元素时有效,但在有多个元素时却无效。

这是代码:

    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存在。

如何删除多个元素?

编辑:我必须将列表变成一个包含多个单独元素的列表。

3 个答案:

答案 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置于集合中并不是必需,但它在概念上更清晰 - 您不关心参数的顺序,或者需要保留任何重复项 - 和它更高效 - 集合可以立即测试成员资格,而不是通过与每个元素进行比较。