Python比较元组

Python比较元组,python,list,compare,Python,List,Compare,您好,我想在Python中将一个列表与另一个列表进行比较,其中元素的顺序无关紧要 乙二醇 应该等于list2=[3,2,1]并等于list3=[3,1,2]等。我想动态执行此操作,因为我不知道列表中存在多少元素?有什么快速的方法吗?我想出的唯一方法是在每个列表中搜索另一个列表的元素,但这有O(n^2)。此外,我无法对列表进行排序,因为在我的实现中,列表是列表的列表。我只是想要一个问题的简单版本的答案,然后修改它!你能帮我吗?你可以简单地将列表转换为集合,然后简单地检查它们是否相等 list1,

您好,我想在Python中将一个列表与另一个列表进行比较,其中元素的顺序无关紧要

乙二醇


应该等于
list2=[3,2,1]
并等于
list3=[3,1,2]
等。我想动态执行此操作,因为我不知道列表中存在多少元素?有什么快速的方法吗?我想出的唯一方法是在每个列表中搜索另一个列表的元素,但这有O(n^2)。此外,我无法对列表进行排序,因为在我的实现中,列表是列表的列表。我只是想要一个问题的简单版本的答案,然后修改它!你能帮我吗?

你可以简单地将列表转换为集合,然后简单地检查它们是否相等

list1, list2, list3 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4]
print set(list1) == set(list2)    # True
print set(list2) == set(list3)    # False
print set(list1) == set(list3)    # False
如果要确保元素的存在次数与其他列表中的相同,可以使用(),如下所示

list1, list2, list3, list4 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4], [1, 2, 3, 3]
from collections import Counter
print Counter(list1) == Counter(list2)    # True
print Counter(list2) == Counter(list3)    # False
print Counter(list1) == Counter(list3)    # False
print Counter(list1) == Counter(list4)    # False

您可以简单地将列表转换为集合,然后简单地检查它们是否相等

list1, list2, list3 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4]
print set(list1) == set(list2)    # True
print set(list2) == set(list3)    # False
print set(list1) == set(list3)    # False
如果要确保元素的存在次数与其他列表中的相同,可以使用(),如下所示

list1, list2, list3, list4 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4], [1, 2, 3, 3]
from collections import Counter
print Counter(list1) == Counter(list2)    # True
print Counter(list2) == Counter(list3)    # False
print Counter(list1) == Counter(list3)    # False
print Counter(list1) == Counter(list4)    # False

如果允许列表包含重复的元素:

def list_eql(x, y):
    return sorted(x) == sorted(y)
def list_eql(x, y):
    return set(x) == set(y)
如果列表中没有重复的元素:

def list_eql(x, y):
    return sorted(x) == sorted(y)
def list_eql(x, y):
    return set(x) == set(y)
编辑:据我所知,您的问题
x
y
是列表列表。 在这种情况下,
set
解决方案将不起作用(因为列表是可变的),您需要首先将内部列表转换为元组:

def list_eql(x, y):
    return set(map(tuple, x)) == set(map(tuple, y))

如果允许列表包含重复的元素:

def list_eql(x, y):
    return sorted(x) == sorted(y)
def list_eql(x, y):
    return set(x) == set(y)
如果列表中没有重复的元素:

def list_eql(x, y):
    return sorted(x) == sorted(y)
def list_eql(x, y):
    return set(x) == set(y)
编辑:据我所知,您的问题
x
y
是列表列表。 在这种情况下,
set
解决方案将不起作用(因为列表是可变的),您需要首先将内部列表转换为元组:

def list_eql(x, y):
    return set(map(tuple, x)) == set(map(tuple, y))

@NG。也许这正是OP想要的,很难说。如果不是的话,
collections.Counter
也可以工作。@NG。我没有任何副本,所以它会工作!谢谢你的回答,我会尽快标记的@德尔南:谢谢:)我已经在答案中包括了:)@NG。也许这正是OP想要的,很难说。如果不是的话,
collections.Counter
也可以工作。@NG。我没有任何副本,所以它会工作!谢谢你的回答,我会尽快标记的@delnan谢谢:)我在答案中包含了这一点:)不幸的是,最简单的解决方案可能仍然是使用自定义排序键对内部列表进行排序。您可能还想看看这个:不幸的是,最简单的解决方案可能仍然是使用自定义排序键对内部列表进行排序。您可能还想看看这一点:如果列表有重复项,仅检查两个列表的长度将不起作用。考虑列表x= [1,1,2,23-],y= [1,1,1,23-3]。即使这两个列表不相等,您的函数也将返回true。如果列表有重复项,仅检查两个列表的长度将不起作用。考虑列表x= [1,1,2,23-],y= [1,1,1,23-3]。您的函数将返回true,即使这两个列表不相等。