一尘不染

确定2个列表是否具有相同的元素,而与顺序无关?

python

很抱歉这个简单的问题,但是我很难找到答案。

当我比较2个列表时,我想知道它们是否“相等”,因为它们具有相同的内容,但是顺序不同。

例如:

x = ['a', 'b']
y = ['b', 'a']

我想x == y评估True


阅读 135

收藏
2020-12-20

共1个答案

一尘不染

您可以简单地检查带有x和y元素的多重集是否相等:

import collections
collections.Counter(x) == collections.Counter(y)

这要求元素是可哈希的。运行时将位于中O(n),其中n列表大小。

如果元素也是唯一的,则还可以转换为集合(相同的渐近运行时,在实践中可能会快一点):

set(x) == set(y)

如果元素不是可哈希的,而是可排序的,则另一个替代方法(在中的运行时O(n log n))是

sorted(x) == sorted(y)

如果元素既不可散列也不可排序,则可以使用以下帮助函数。请注意,它将非常慢(O(n²)),并且通常 不应不可
散列和不可排序元素的神秘情况之外使用。

def equal_ignore_order(a, b):
    """ Use only when elements are neither hashable nor sortable! """
    unmatched = list(b)
    for element in a:
        try:
            unmatched.remove(element)
        except ValueError:
            return False
    return not unmatched
2020-12-20