你好,我想要一个名单与Python的另一个列表,其中的元素序列好好尝试一下事项Python的元组进行比较
如
list=[1,2,3]
应等于list2=[3,2,1]
和等于list3=[3,1,2]
等。我想动态地这样做,因为我不知道列表中有多少元素?有没有快速的方法来做到这一点?我想出的唯一方法是在每个列表中搜索另一个列表的元素,但这有O(n^2)。此外,我无法排序列表,因为在我的实施中,列表是列表的列表。我只想回答简单版本的问题,然后修改它!你可以帮我吗?
你好,我想要一个名单与Python的另一个列表,其中的元素序列好好尝试一下事项Python的元组进行比较
如
list=[1,2,3]
应等于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
如果你想确保元素只存在相同数量的倍于其他列表中,你可以使用collections.counter
(Thanks @delnan),这样
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)
编辑:我明白你的问题x
和y
是列出的名单。 在这种情况下set
解决方案将无法正常工作(因为列表是可变的),你将需要内部列表第一转换为元组:
def list_eql(x, y):
return set(map(tuple, x)) == set(map(tuple, y))
如果列表有重复,只检查两个列表的长度将不起作用。 考虑列表x = [1,1,2,2,3],y = [1,1,1,2,3]。即使这两个列表不相等,你的函数也会返回true。 –
@ sk4x0r:很好,我已经编辑了我的答案,谢谢。 –
不幸的是,最简单的解决办法可能_still_是与内部列表进行排序一个自定义的排序键。 –
你可能也想看看这个:http://stackoverflow.com/questions/21029678/undirected-tuple-comparison – fedorSmirnov