Python教程:高效比较两个列表的多种方法

引言

在编程或学习Python时,您可能需要判断两个或多个列表是否相等。当比较列表的相等性时,您实际上是在检查列表是否具有相同的长度,并且列表中的每个元素是否都相等。长度不同的列表永远不会被认为是相等的。

本文将介绍如何使用以下Python功能来比较列表:

  • 使用 sort() 方法或 sorted() 函数配合 == 运算符
  • 使用 set() 函数配合 == 运算符
  • 使用 reduce()map() 函数配合 == 运算符
  • 使用 collections.Counter() 类配合 == 运算符
  • 使用列表推导式(list comprehension)

使用 sort() 方法或 sorted() 函数比较列表

您可以使用 sort() 方法或 sorted() 函数对列表进行排序,以便比较它们的相等性。sort() 方法会原地排序列表,而 sorted() 函数会返回一个新的已排序列表。排序后,如果两个列表相等,它们在相同索引位置上的元素将完全相同。== 运算符会逐个元素进行比较(即逐元素比较)。

在比较之前,原始列表元素的顺序并不重要,因为列表会在排序后进行比较。

注意:只能对包含相同数据类型的列表进行排序。

sort() 方法示例

下面的例子演示了如何使用 sort() 方法对列表进行排序和比较判等:

l1 = [10, 20, 30, 40, 50]
l2 = [20, 30, 50, 40, 70]
l3 = [50, 10, 30, 20, 40]

l1.sort()
l2.sort()
l3.sort()

if l1 == l2:
    print("列表 l1 和 l2 相同")
else:
    print("列表 l1 和 l2 不相同")

if l1 == l3:
    print("列表 l1 和 l3 相同")
else:
    print("列表 l1 和 l3 不相同")
输出
列表 l1 和 l2 不相同
列表 l1 和 l3 相同

上述示例代码对每个列表进行排序,然后比较 l1l3 的结果并打印,接着比较 l1l2 的结果并打印。

sorted() 函数示例

这是文章《如何在Python中比较两个列表》的第2部分(共6部分)。

下面的示例演示了如何使用sorted()函数对列表进行排序并比较它们是否相等。

l1 = [10, 20, 30, 40, 50]
l2 = [20, 30, 50, 40, 70]
l3 = [50, 10, 30, 20, 40]

l1_sorted = sorted(l1)
l2_sorted = sorted(l2)
l3_sorted = sorted(l3)

if l1_sorted == l2_sorted:
    print ("列表 l1 和 l2 相同")
else:
    print ("列表 l1 和 l2 不相同")

if l1_sorted == l3_sorted:
    print ("列表 l1 和 l3 相同")
else:
    print ("列表 l1 和 l3 不相同")
输出

列表 l1 和 l2 不相同
列表 l1 和 l3 相同

上述代码示例首先返回每个列表的排序版本,然后比较l1l3并打印结果,接着比较l1l2并打印结果。

使用 reduce()map() 函数来比较列表

这是文章《如何在Python中比较两个列表》的第3部分(共6部分)。

你可以使用Python的map()函数与functools.reduce()函数来比较两个列表的数据项。当它们结合使用时,map()函数会将给定的函数应用于每个元素,而reduce()函数则确保以连续的方式应用函数。

map()函数

map()函数接受一个函数和一个可迭代对象作为参数。map()函数将给定的函数应用于可迭代对象的每个项,然后返回一个map对象(迭代器)作为结果。

functools.reduce()函数

functools.reduce()函数也接受一个函数和一个可迭代对象作为参数。functools.reduce()函数递归地将给定的函数应用于可迭代对象的每个元素。最初,functools.reduce()函数将该函数应用于第一个和第二个元素,并返回结果,然后将该函数应用于结果和第三个元素,并继续直到列表没有剩余项。

当你将它们结合使用时,map()函数将给定的函数应用于每个元素,而reduce()函数则确保以连续的方式应用该函数。

当使用reduce()map()函数时,列表项的顺序是重要的。具有相同项但顺序不同的列表在进行相等性比较时不会返回True。如果需要,可以先对列表进行排序。

以下示例演示了如何使用reduce()map()函数来比较列表的相等性:

import functools

l1 = [10, 20, 30, 40, 50]
l2 = [20, 30, 50, 40, 70]
l3 = [10, 20, 30, 40, 50]

if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l2), True):
    print ("列表 l1 和 l2 相同")
else:
    print ("列表 l1 和 l2 不相同")

if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l3), True):
    print ("列表 l1 和 l3 相同")
else:
    print ("列表 l1 和 l3 不相同")

输出结果是:


列表 l1 和 l2 不相同
列表 l1 和 l3 相同
输出

这是文章《如何在Python中比较两个列表》的第4部分(共6部分)。

列表 l1 和 l2 不相同

列表 l1 和 l3 相同

上述示例代码将 l1 与 l2 进行比较,然后将 l1 与 l3 进行比较。

使用 set() 函数比较列表

你可以使用 set() 函数根据给定的列表创建集合对象,然后使用 == 运算符比较这些集合是否相等。

原始列表项的顺序并不重要,因为当每个集合包含相同项(无论顺序如何)时,== 运算符会返回 True

注意:在一个集合中,重复的列表项只会出现一次。下面的示例演示如何将列表转换为集合并比较这些集合是否相等。

l1 = [10, 20, 30, 40, 50]
l2 = [50, 10, 30, 20, 40]

a = set(l1)
b = set(l2)

if a == b:
    print("Lists l1 and l2 are equal")
else:
    print("Lists l1 and l2 are not equal")

输出是:

输出
Lists l1 and l2 are equal

前面的示例代码根据列表 l1l2 创建了集合 ab,然后比较这两个集合并打印结果。

使用 collections.Counter() 类比较列表

使用 `collections.Counter()` 比较列表(方法五)

在Python中,collections.Counter() 类是比较两个列表的强大工具。它通过计算列表中每个元素的出现频率,并将结果存储为{值: 频率}的字典形式。如果两个列表经过Counter()处理后得到相同的字典输出,则可以推断这两个列表是等价的。

使用Counter类进行列表比较时,原始列表中元素的顺序并不重要,这使得它非常适合比较无序集合。

以下示例演示了如何从给定列表创建计数器对象,并比较它们的相等性:

import collections

l1 = [10, 20, 30, 40, 50]
l2 = [20, 30, 50, 40, 70]
l3 = [50, 20, 30, 40, 10]

if collections.Counter(l1) == collections.Counter(l2):
    print ("列表 l1 和 l2 相同")
else:
    print ("列表 l1 和 l2 不相同")

if collections.Counter(l1) == collections.Counter(l3):
    print ("列表 l1 和 l3 相同")
else:
    print ("列表 l1 和 l3 不相同")

输出结果:


列表 l1 和 l2 不相同
列表 l1 和 l3 相同

上述示例代码首先为列表 l1l2 创建了计数器对象,然后进行比较并打印结果。接着,它对列表 l1l3 重复了相同的操作。

使用列表推导式比较列表

这是文章《如何在Python中比较两个列表》的第6部分(共6部分)。

使用列表推导式比较列表

你可以使用列表推导式来比较两个列表。有关列表推导式的更多信息,请参阅Python 3中的理解列表推导式

当使用列表推导式比较列表时,原始列表项的顺序并不重要。

下面的例子展示了如何使用列表推导式来比较列表:

l1 = [10, 20, 30, 40, 50]
l2 = [50, 75, 30, 20, 40]
l3 = [50, 20, 30, 40, 10]

res = [x for x in l1 + l2 if x not in l1 or x not in l2]

print(res)
if not res:
    print("列表l1和l2相等")
else:
    print("列表l1和l2不相等")

res2 = [x for x in l1 + l3 if x not in l1 or x not in l3]

print(res2)
if not res2:
    print("列表l1和l3相等")
else:
    print("列表l1和l3不相等")

前面的示例代码将指针元素x设置为列表l1l2的组合,然后检查该元素是否存在于其中一个列表中但不在另一个列表中。如果结果res是一个空列表,那么可以推断这两个列表是相等的,因为没有只出现在其中一个列表中的项目。

输出结果
[10, 75]
列表l1和l2不相等
[]
列表l1和l3相等

总结

本文描述了几种在Python中比较列表是否相等的方法。请继续学习更多关于Python的教程。

bannerAds