Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在另一个列表中,Python会删除列表中的多个元素_Python_Python 2.7 - Fatal编程技术网

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

如果在另一个列表中,Python会删除列表中的多个元素,python,python-2.7,Python,Python 2.7,我有两个数组,如果从客户端接收的数组中存在一个元素,那么它应该删除另一个数组中匹配的数组。当客户机阵列只有一个元素时,这种方法有效,但当它有多个元素时则无效 代码如下: projects = ['xmas','easter','mayday','newyear','vacation'] for i in self.get_arguments('del[]'): try: if i in projects:

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

代码如下:

    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_参数('del[])
,以以下格式从客户端返回数组:

[u'xmas , newyear, mayday']
所以它读作一个元素而不是三个元素,因为只有一个unicode存在

如何使其删除多个元素


编辑:我不得不将列表与几个单独的元素整合在一起。

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

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

您必须重新编写您的原始项目,这不是最优雅的,但这应该会起作用。

如何进行
筛选

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

这不起作用的原因是
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]

在这里,将
参数
组合成一个集合并不是很重要,但是概念上更清晰,您不需要考虑参数的顺序,或者需要保留任何副本,而且更有效的是,集合可以立即测试成员资格,而不是通过比较每个元素。

首先,您需要知道,如果您的
状态没有引发
值错误
!谢谢你的回答,但我已经尝试了所有的解决方案,它们也不会删除多个元素。你能显示
get_arguments
函数吗?
get_arguments
是一个
Tornado
函数。我用这个来获取html表单参数,请给我们一个。您的示例没有任何重复的元素,它没有给我们任何提示
self.get_arguments('del[])
可能返回什么,并且它没有向我们显示所需的与实际的结果,这使得您很难调试代码。