如何在Python中比较两个列表
简介
在编程或学习Python时,您可能需要确定两个或多个列表是否相等。当您比较列表的相等性时,您正在检查列表是否具有相同的长度以及列表中的每个项是否相等。长度不同的列表永远不相等。
本文介绍如何使用以下Python功能来比较列表:
- sort() method or the sorted() function with the == operator
- set() function with the == operator
- reduce() and map() functions with the == operator
- collection.Counter() class with the == operator
- list comprehension
使用sort()方法或sorted()函数来比较列表。
你可以使用sort()方法或sorted()函数对列表进行排序,以便比较它们的相等性。sort()方法会原位排序列表,而sorted()函数会返回一个新的列表。排序后,相等的列表在相同的索引位置上会有相同的项目。==运算符会逐个项目进行比较(逐元素比较)。
在比较之前,原始列表项的顺序并不重要,因为列表会在排序后进行比较。
Note
排序()方法示例
下面这个例子演示了如何使用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 ("The lists l1 and l2 are the same")
else:
print ("The lists l1 and l2 are not the same")
if l1 == l3:
print ("The lists l1 and l3 are the same")
else:
print ("The lists l1 and l3 are not the same")
输出为:
The lists l1 and l3 are the same The lists l1 and l2 are not the same
前面的示例代码对每个列表进行排序,比较l1和l3的结果并打印,然后比较l1和l2的结果并打印。
sorted()函数的例子
下面的示例演示了如何使用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 ("The lists l1 and l2 are the same")
else:
print ("The lists l1 and l2 are not the same")
if l1_sorted == l3_sorted:
print ("The lists l1 and l3 are the same")
else:
print ("The lists l1 and l3 are not the same")
输出是:
The lists l1 and l3 are the same The lists l1 and l2 are not the same
之前的代码示例返回每个列表的排序版本,比较l1和l3并打印结果,然后比较l1和l2并打印结果。
使用reduce()和map()函数来比较列表。
你可以使用Python的map()函数与functools.reduce()函数来比较两个列表的数据项。当你将它们结合使用时,map()函数会将给定的函数应用于每个元素,而reduce()函数则确保以连续的方式应用函数。
map()函数接受一个函数和一个可迭代对象作为参数。map()函数将给定的函数应用于可迭代对象的每个项,然后将返回一个map对象(迭代器)作为结果。
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 ("The lists l1 and l2 are the same")
else:
print ("The lists l1 and l2 are not the same")
if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l3), True):
print ("The lists l1 and l3 are the same")
else:
print ("The lists l1 and l3 are not the same")
输出结果是:
The lists l1 and l2 are not the same The lists l1 and l3 are the same
上述示例代码将l1与l2进行比较,然后将l1与l3进行比较。
使用set()函数来比较列表
你可以使用 set() 函数来使用给定的列表创建集合对象,然后使用 == 运算符比较这些集合是否相等。
原始列表项的顺序并不重要,因为当每个集合包含相同项的任意顺序时,”==” 运算符返回 true。
Note
下面的示例演示如何将列表转为集合并比较这些集合是否相等。
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
前面的例子代码根据列表l1和l2创建了集合a和b,然后比较这两个集合并打印结果。
使用collections.Counter()类来比较列表
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 ("The lists l1 and l2 are the same")
else:
print ("The lists l1 and l2 are not the same")
if collections.Counter(l1) == collections.Counter(l3):
print ("The lists l1 and l3 are the same")
else:
print ("The lists l1 and l3 are not the same")
输出是:
The lists l1 and l2 are not the same The lists l1 and l3 are the same
前面的示例代码为列表l1和l2创建了计数器对象,进行对比并打印结果。该代码会重复为列表l1和l3执行相同的操作。
使用列表推导来比较列表。
你可以使用列表推导式来比较两个列表。有关列表推导式的更多信息,请参阅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("Lists l1 and l2 are equal")
else:
print("Lists l1 and l2 are not equal")
res2 = [x for x in l1 + l3 if x not in l1 or x not in l3]
print(res2)
if not res2:
print("Lists l1 and l3 are equal")
else:
print("Lists l1 and l3 are not equal")
前面的示例代码将指针元素x设置为列表l1和l2,然后检查指针元素指向的项目是否存在于列表中。如果结果res是一个空列表,那么可以推断这两个列表是相等的,因为没有只出现在其中一个列表中的项目。
输出结果为:
[10, 75] Lists l1 and l2 are not equal
结论是
这篇文章描述了几种在Python中比较列表是否相等的方法。请继续学习更多关于Python的教程。