Python在一个列表中查找不在oth中的元素

2024-04-25 20:18:57 发布

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

我需要比较两个列表,以便创建一个列表中的特定元素的新列表,而不是另一个列表中的特定元素。例如:

main_list=[]
list_1=["a", "b", "c", "d", "e"]
list_2=["a", "f", "c", "m"] 

我想循环遍历list_1并将list_2中所有在list_1中找不到的元素追加到main_list。

结果应该是:

main_list=["f", "m"]

我怎么用python呢?


Tags: 元素列表mainlist
3条回答

(1)可以使用NumPy的^{}array1array2assume_unique=False)。

这将在array1中产生在array2不是的唯一值。assume_unique默认为False(如果您知道array1array2都是唯一的,则将其设置为True)。

对于那些希望对答案进行排序的人:
(1.1)将assume_unique设置为False将自动发出排序数组。
(1.2)将assume_unique设置为True将生成(可能)未排序数组。

为了解决这个问题,我制作了一个自定义函数:

import numpy as np
def setdiff_sorted(array1,array2,assume_unique=False):
    ans = np.setdiff1d(array1,array2,assume_unique).tolist()
    if assume_unique:
        return sorted(ans)
    return ans

如果您关心的是唯一的元素(基于response of Chinny84),那么:

list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"] 
main_list = setdiff_sorted(list_2,list_1)

(2)否则,使用main_list = setdiff_sorted(list_2,list_1, assume_unique=True)

两个答案都会给你["f", "m"]


边注:
(a) 自定义函数setdiff_sorted返回一个列表(与NumPy的setdiff1d中的数组相比)。

(b) 如果这两个列表中的任何一个是而不是唯一的,情况就会不同。
list_2 = ["a", "f", "c", "m", "m"]
答案(1)产生["f", "m"],但答案(2)给出["f", "m", "m"](因为list_2中每个元素的唯一性无关紧要)。不过,这两个答案都是排序的。

当您有可用的本机方法时,不确定上述解释为何如此复杂:

main_list = list(set(list_2)-set(list_1))

可以使用集合:

main_list = list(set(list_2) - set(list_1))

输出:

>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> set(list_2) - set(list_1)
set(['m', 'f'])
>>> list(set(list_2) - set(list_1))
['m', 'f']

根据@JonClements的评论,这里有一个更整洁的版本:

>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> list(set(list_2).difference(list_1))
['m', 'f']

相关问题 更多 >