[英]How to compare two lists and remove elements in python
我有两个清单。 我正在尝试删除在第二个列表中的任何元素之前发生的第一个列表中的所有元素。 这应该只发生一次。 举个例子:让,
list1 = ['a','d','k','1','3','a','f','3']
list2=['1','2','3','4','5']
我的结果列表应该是什么:
listResult=['1','3','a','f','3']
在列表 1 中,在列表 2 中找到元素“1”。 因此,必须删除“1”之前的所有项目。 这不应该发生在元素“3”上,因为移除过程必须在一次移除后中断。
我尝试过以下方法,但它只考虑一个给定的特定元素。 我正在尝试的不仅是考虑一个元素,还要考虑一个元素列表。
from itertools import dropwhile
list1 = ['a','d','k','1','3','a','f','3']
element = '1'
list(dropwhile(lambda x: x != element, list1))
在 lambda 中应使用in
运算符进行遏制测试:
>>> list(dropwhile(lambda x, s=frozenset(list2): x not in s, list1))
['1', '3', 'a', 'f', '3']
另一个有趣但效率略低的解决方案:
>>> from itertools import compress, accumulate
>>> from operator import or_
>>> s = set(list2)
>>> list(compress(list1, accumulate((x in s for x in list1), or_)))
['1', '3', 'a', 'f', '3']
因为accumulate
第二个参数的默认值相当于operator.add
,在Python中总是将正数视为真,所以or_
可以省略:
>>> list(compress(list1, accumulate(x in s for x in list1)))
['1', '3', 'a', 'f', '3']
我们可以使用 list1 创建一个set
,该集合可用于检查list2
中的项目是否存在于list1
中。
如果它存在,我们可以获取项目的索引并从项目索引中获取子数组。 然后我们可以打破循环。
list1 = ['a','d','k','1','3','a','f','3']
list2 = ['1','2','3','4','5']
listResult = []
set1 = set(list1)
for i in list2:
if (i in set1):
idx = list1.index(i)
listResult = list1[idx:]
break
print(listResult)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.