如果在另一个列表中,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[])
可能返回什么,并且它没有向我们显示所需的与实际的结果,这使得您很难调试代码。