如何在Python中比较两个列表,并返回第二个列表是否具有相同的值(无论顺序如何)?

11
a = [1, 2, 3, 4]
b = [2, 4, 3, 1]
c = [2, 3]
当比较a和b时,应该返回True:所有在a中的项目都存在于b中,并且所有在b中的项目也存在于a中。
当比较ac时,应该返回False:在a中存在在c中不存在的项目。
Pythonic的方法是什么?

2
你的列表中是否有重复的条目? - Howard
没有重复。 - Somebody still uses you MS-DOS
1
如果顺序不重要,你应该使用集合而不是列表。 - user395760
2
此外,喜欢这个名字@SomebodystillusesyouMS-DOS。 - marr75
在我提供的领域中,为什么应该使用集合?对我来说,“sorted(a) == sorted(b)”更简单、更易读。比较的列表不会很大——每个列表最多只有10个项目,并且这种比较只会进行几次。虽然@marr75说使用集合更易读(我知道他的答案还有其他论点),但我认为@Ignacio Vazquez-Abrams的解决方案更简单,更容易在我的情况下使用。 - Somebody still uses you MS-DOS
如果有重复项或项目不可哈希化,则集合将无法正常工作。 - sevko
4个回答

19

排序,然后比较。

sorted(a) == sorted(b)

7
使用集合或不可变集合(frozensets)。
set_a = {1, 2, 3, 4} #python 2.7 or higher set literal, use the set(iter) syntax for older versions
set_b = {2, 4, 4, 1}

set_a == set_b

set_a - set_b == set_b - set_a

使用集合的最大优势是它非常易读,而且不会改变原始的可迭代对象。即使 a 非常大而 b 很小,它也可以表现得很好(如果经常需要检查 a 和 b 是否具有相同的长度,则首先检查这种情况是一个好的优化方法),使用适当的数据结构来完成工作是符合 Python 风格的。

3
可能的缺点是在一个集合中不允许有重复的元素。 - x-yuri

2

使用set集合:

In [4]: set(a) == set(b)
Out[4]: True

In [5]: set(a) == set(c)
Out[5]: False

2

将它们转换成集合:

>>> set([1,2,3,4]) == set([2,4,3,1])
True

>>> set([2, 3]) == set([1,2,3,4])
False

如果您的列表中包含重复项,您需要比较它们的长度。使用集合可消除重复项。

2
仅检查长度是不够的:“[1,1,2,3] != [1,2,3,3]” - Howard
2
@Howard:但唯一的标准是:a中的所有项目都出现在b中,而b中的所有项目都出现在a中。按照这些标准,[1,1,2,3] == [1,2,3,3] - johnsyweb
按照他问题的最严格描述来看,长度并不重要,提问者描述了一次测试,在该测试中,a中的所有项目都出现在b中。 - marr75
2
@Johnsyweb 是的,你说得对。我对问题的理解有点不同。 - Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接