如何比较python中的列表/集列表?

tan*_*ang 24 python compare tuples list set

比较2个列表/集合并输出差异的最简单方法是什么?是否有任何内置函数可以帮助我比较嵌套列表/集合?

输入:

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]]  
Run Code Online (Sandbox Code Playgroud)

预期产出:

Differences = [['Test3.doc', '3c3c3c', 3333],
               ['Test3.doc', '8p8p8p', 9999], 
               ['Test4.doc', '4d4d4d', 4444]]
Run Code Online (Sandbox Code Playgroud)

dr *_*bob 32

所以你想要两个项目列表之间的区别.

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]]
Run Code Online (Sandbox Code Playgroud)

首先,我将每个列表列表转换为元组列表,因为元组是可清除的(列表不是),因此您可以将元组列表转换为一组元组:

first_tuple_list = [tuple(lst) for lst in first_list]
secnd_tuple_list = [tuple(lst) for lst in secnd_list]
Run Code Online (Sandbox Code Playgroud)

然后你可以制作套装:

first_set = set(first_tuple_list)
secnd_set = set(secnd_tuple_list)
Run Code Online (Sandbox Code Playgroud)

编辑(由sdolan建议):您可以在单行中为每个列表完成最后两个步骤:

first_set = set(map(tuple, first_list))
secnd_set = set(map(tuple, secnd_list))
Run Code Online (Sandbox Code Playgroud)

注意:map是一个函数式编程命令,它将第一个参数(在本例中为tuple函数)中的函数应用于第二个参数中的每个项目(在我们的示例中是列表列表).

并找到集合之间的对称差异:

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

注意first_set ^ secnd_set等同于symmetric_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]]
Run Code Online (Sandbox Code Playgroud)

或者具有功能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]]
Run Code Online (Sandbox Code Playgroud)

  • +1:但我认为`map(tuple,first_list)`对于元组转换来说更清晰.另外,`symmetric_difference`不需要为它的第一个参数设置一个集合,所以你可以跳过`secnd_set`中的set转换(虽然它可能只是在封面下). (3认同)