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做到这一点?

原文由 CosimoCD 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

TL;博士:

解决方案 (1)

 import numpy as np
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`

解决方案(2) 你想要一个排序列表

def setdiff_sorted(array1,array2,assume_unique=False):
    ans = np.setdiff1d(array1,array2,assume_unique).tolist()
    if assume_unique:
        return sorted(ans)
    return ans
main_list = setdiff_sorted(list_2,list_1)


说明:

(1) You can use NumPy’s setdiff1d ( array1 , array2 , assume_unique = False ).

assume_unique 询问用户数组是否已经唯一。

如果 False ,则首先确定唯一元素。

如果 True ,该函数将假定元素已经是唯一的并且函数将跳过确定唯一元素。

这会产生 array1 中不 存在的唯一值 array2assume_unique 默认为 False

如果您关心 独特的 元素(基于 Chinny84 的响应),那么只需使用(其中 assume_unique=False => 默认值):

 import numpy as np
list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"]
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`

(2) 对于那些想要对答案进行排序的人,我制作了一个自定义函数:

 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

要获得答案,请运行:

 main_list = setdiff_sorted(list_2,list_1)


旁注:

(a) 解决方案 2(自定义函数 setdiff_sorted )返回一个 列表(与解决方案 1 中的 数组 相比)。

(b) 如果您不确定元素是否唯一,只需在解决方案 A 和 B 中使用 NumPy 的默认设置 setdiff1d 。什么是复杂的例子?见注©。

© 如果两个列表中的任何一个 不是 唯一的,情况就会有所不同。

list_2 不是唯一的: list2 = ["a", "f", "c", "m", "m"] 。保持 list1 原样: list_1 = ["a", "b", "c", "d", "e"]

设置 assume_unique 的默认值会产生 ["f", "m"] (在两种解决方案中)。但是,如果您设置 assume_unique=True ,两种解决方案都会给出 ["f", "m", "m"] 。为什么?这是因为用户假设元素是唯一的)。因此,最好将 assume_unique 保持为默认值。请注意,两个答案都已排序。

蟒蛇 _

原文由 jcoderepo 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用集合:

 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']

原文由 nrlakin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏