Python删除列表中的多个元素(如果在另一个lis中)

2024-10-06 12:35:27 发布

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

我有两个数组,如果一个元素存在于从客户机接收的数组中,那么它应该删除另一个数组中的匹配数组。当客户机阵列只有一个元素时,这种方法有效,但当它有多个元素时,这种方法无效。你知道吗

代码如下:

    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']

所以它读作一个元素而不是三个元素,因为只有一个unicode存在。你知道吗

我怎样才能删除多个元素?你知道吗

编辑:我不得不把列表分成几个单独的元素。你知道吗


Tags: 方法代码inself元素get客户机数组
3条回答

可以尝试一些超级Python式的东西,比如列表理解:

new_list = [i for i in projects if i not in array_two]

你必须写下你原来的项目,这不是最优雅的,但这应该工作。你知道吗

这不起作用的原因是remove只是删除了第一个匹配的元素。您可以通过反复调用remove直到它不再存在来解决这个问题,例如,将您的if更改为while,如下所示:

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生成一个集合在这里并不是必要的,但它在概念上更清晰—您不关心参数的顺序,也不需要保留任何重复项,而且更有效的集合可以立即测试成员身份,而不是通过比较每个元素。你知道吗

filter呢?你知道吗

projects = filter(lambda a: a not in self.get_arguments('del[]'), projects)

相关问题 更多 >