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 相同
上述示例代码对每个列表进行排序,然后比较 l1
和 l3
的结果并打印,接着比较 l1
和 l2
的结果并打印。
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 相同
上述代码示例首先返回每个列表的排序版本,然后比较l1
和l3
并打印结果,接着比较l1
和l2
并打印结果。
使用 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
前面的示例代码根据列表 l1
和 l2
创建了集合 a
和 b
,然后比较这两个集合并打印结果。
使用 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 相同
上述示例代码首先为列表 l1
和 l2
创建了计数器对象,然后进行比较并打印结果。接着,它对列表 l1
和 l3
重复了相同的操作。
使用列表推导式比较列表
这是文章《如何在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
设置为列表l1
和l2
的组合,然后检查该元素是否存在于其中一个列表中但不在另一个列表中。如果结果res
是一个空列表,那么可以推断这两个列表是相等的,因为没有只出现在其中一个列表中的项目。
[10, 75]
列表l1和l2不相等
[]
列表l1和l3相等
总结
本文描述了几种在Python中比较列表是否相等的方法。请继续学习更多关于Python的教程。