如何在Python中比较列表的列表/集合?

39 投票
8 回答
80801 浏览
提问于 2025-04-16 18:13

比较两个列表或集合,找出它们之间的不同,最简单的方法是什么?有没有什么内置的函数可以帮助我比较嵌套的列表或集合?

输入:

First_list = [['Test.doc', '1a1a1a', 1111], 
              ['Test2.doc', '2b2b2b', 2222],  
              ['Test3.doc', '3c3c3c', 3333]
             ]  
Secnd_list = [['Test.doc', '1a1a1a', 1111], 
              ['Test2.doc', '2b2b2b', 2222], 
              ['Test3.doc', '8p8p8p', 9999], 
              ['Test4.doc', '4d4d4d', 4444]]  

预期输出:

Differences = [['Test3.doc', '3c3c3c', 3333],
               ['Test3.doc', '8p8p8p', 9999], 
               ['Test4.doc', '4d4d4d', 4444]]

8 个回答

3

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是使用的工具和库不兼容。为了找到问题的根源,我们可以通过调试来一步步检查代码的运行情况。

调试的过程就像是侦探在寻找线索。我们可以在代码中设置一些检查点,看看程序在运行到这些地方时,变量的值是什么,程序的状态如何。这样,我们就能更清楚地知道问题出在哪里。

另外,查看错误信息也很重要。错误信息通常会告诉我们出错的地方和原因,虽然有时候它们可能看起来有点复杂,但仔细阅读可以帮助我们更快地解决问题。

总之,遇到问题时不要慌张,慢慢来,逐步检查,找到问题的所在,才能让代码正常运行。

>>> First_list = [['Test.doc', '1a1a1a', '1111'], ['Test2.doc', '2b2b2b', '2222'], ['Test3.doc', '3c3c3c', '3333']] 
>>> Secnd_list = [['Test.doc', '1a1a1a', '1111'], ['Test2.doc', '2b2b2b', '2222'], ['Test3.doc', '3c3c3c', '3333'], ['Test4.doc', '4d4d4d', '4444']] 


>>> z = [tuple(y) for y in First_list]
>>> z
[('Test.doc', '1a1a1a', '1111'), ('Test2.doc', '2b2b2b', '2222'), ('Test3.doc', '3c3c3c', '3333')]
>>> x = [tuple(y) for y in Secnd_list]
>>> x
[('Test.doc', '1a1a1a', '1111'), ('Test2.doc', '2b2b2b', '2222'), ('Test3.doc', '3c3c3c', '3333'), ('Test4.doc', '4d4d4d', '4444')]


>>> set(x) - set(z)
set([('Test4.doc', '4d4d4d', '4444')])
3

不太确定有没有简单的函数可以做到这一点,不过“手动”做也不难:

differences = []

for list in firstList:
    if list not in secondList:
        differences.append(list)
46

所以你想知道两个物品列表之间的区别。

first_list = [['Test.doc', '1a1a1a', 1111], 
              ['Test2.doc', '2b2b2b', 2222], 
              ['Test3.doc', '3c3c3c', 3333]]
secnd_list = [['Test.doc', '1a1a1a', 1111], 
              ['Test2.doc', '2b2b2b', 2222], 
              ['Test3.doc', '8p8p8p', 9999], 
              ['Test4.doc', '4d4d4d', 4444]]

首先,我会把每个列表里的列表转换成一个元组的列表,因为元组是可以被哈希的(而列表不可以),这样你就可以把元组的列表转换成元组的集合:

first_tuple_list = [tuple(lst) for lst in first_list]
secnd_tuple_list = [tuple(lst) for lst in secnd_list]

然后你可以创建集合:

first_set = set(first_tuple_list)
secnd_set = set(secnd_tuple_list)

编辑(sdolan建议的):你可以把最后两个步骤合并成一行代码来处理每个列表:

first_set = set(map(tuple, first_list))
secnd_set = set(map(tuple, secnd_list))

注意:map是一个函数式编程的命令,它会把第一个参数中的函数(在这个例子中是tuple函数)应用到第二个参数中的每个项目(在我们的例子中是一个列表的列表)。

然后找到这两个集合之间的对称差集:

>>> first_set.symmetric_difference(secnd_set) 
set([('Test3.doc', '3c3c3c', 3333),
     ('Test3.doc', '8p8p8p', 9999),
     ('Test4.doc', '4d4d4d', 4444)])

注意,first_set ^ secnd_setsymmetric_difference是等价的。

如果你不想使用集合(比如说你在用python 2.2),其实也很简单。比如,可以使用列表推导:

>>> [x for x in first_list if x not in secnd_list] + [x for x in secnd_list if x not in first_list]
[['Test3.doc', '3c3c3c', 3333],
 ['Test3.doc', '8p8p8p', 9999],
 ['Test4.doc', '4d4d4d', 4444]]

或者使用函数式的filter命令和lambda函数。(你需要测试这两种方法并结合使用)。

>>> filter(lambda x: x not in secnd_list, first_list) + filter(lambda x: x not in first_list, secnd_list)

[['Test3.doc', '3c3c3c', 3333],
 ['Test3.doc', '8p8p8p', 9999],
 ['Test4.doc', '4d4d4d', 4444]]

撰写回答