繁体   English   中英

如何比较两个列表并删除 python 中的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM