a = [1, 2, 3, 1, 2, 3]
b = [3, 2, 1, 3, 2, 1]
A和b应该被认为是相等的,因为它们有完全相同的元素,只是顺序不同。
问题是,我的实际列表将由对象(我的类实例)组成,而不是整数。
a = [1, 2, 3, 1, 2, 3]
b = [3, 2, 1, 3, 2, 1]
A和b应该被认为是相等的,因为它们有完全相同的元素,只是顺序不同。
问题是,我的实际列表将由对象(我的类实例)组成,而不是整数。
当前回答
你可以对两者进行排序:
sorted(a) == sorted(b)
计数排序也可能更有效(但它要求对象是可哈希的)。
>>> from collections import Counter
>>> a = [1, 2, 3, 1, 2, 3]
>>> b = [3, 2, 1, 3, 2, 1]
>>> print (Counter(a) == Counter(b))
True
其他回答
from collections import defaultdict
def _list_eq(a: list, b: list) -> bool:
if len(a) != len(b):
return False
b_set = set(b)
a_map = defaultdict(lambda: 0)
b_map = defaultdict(lambda: 0)
for item1, item2 in zip(a, b):
if item1 not in b_set:
return False
a_map[item1] += 1
b_map[item2] += 1
return a_map == b_map
如果数据高度无序,排序可能会非常慢(当项具有某种程度的有序时,timsort特别好)。对两个列表进行排序也需要对两个列表进行完全迭代。
而不是改变列表,只是分配一个集合,并做左->右成员检查,保持每个项目存在的数量:
如果两个列表的长度不一样,可以立即短路并返回False。 如果你点击了列表a中任何不在列表b中的项,你可以返回False 如果查看了所有项,则可以比较a_map和b_map的值,以确定它们是否匹配。
在许多情况下,这允许您在迭代两个列表之前就短路。
O(n): Counter()方法是最好的(如果你的对象是可哈希的):
def compare(s, t):
return Counter(s) == Counter(t)
O(n log n): sorted()方法是次优方法(如果你的对象是可排序的):
def compare(s, t):
return sorted(s) == sorted(t)
O(n * n):如果对象既不是可哈希的,也不是可排序的,你可以使用相等:
def compare(s, t):
t = list(t) # make a mutable copy
try:
for elem in s:
t.remove(elem)
except ValueError:
return False
return not t
你可以对两者进行排序:
sorted(a) == sorted(b)
计数排序也可能更有效(但它要求对象是可哈希的)。
>>> from collections import Counter
>>> a = [1, 2, 3, 1, 2, 3]
>>> b = [3, 2, 1, 3, 2, 1]
>>> print (Counter(a) == Counter(b))
True
您可以编写自己的函数来比较这些列表。
让我们得到两个列表。
list_1=['John', 'Doe']
list_2=['Doe','Joe']
首先,我们定义一个空字典,计数列表项并写入字典。
def count_list(list_items):
empty_dict={}
for list_item in list_items:
list_item=list_item.strip()
if list_item not in empty_dict:
empty_dict[list_item]=1
else:
empty_dict[list_item]+=1
return empty_dict
之后,我们将使用下面的函数比较两个列表。
def compare_list(list_1, list_2):
if count_list(list_1)==count_list(list_2):
return True
return False
compare_list(list_1,list_2)
最好的方法是对列表进行排序并进行比较。(使用Counter对不可哈希的对象无效。)这对于整数来说很简单:
sorted(a) == sorted(b)
对于任意对象,这就有点棘手了。如果您关心对象的身份,即相同的对象是否在两个列表中,您可以使用id()函数作为排序键。
sorted(a, key=id) == sorted(b, key==id)
(In Python 2.x you don't actually need the key= parameter, because you can compare any object to any object. The ordering is arbitrary but stable, so it works fine for this purpose; it doesn't matter what order the objects are in, only that the ordering is the same for both lists. In Python 3, though, comparing objects of different types is disallowed in many circumstances -- for example, you can't compare strings to integers -- so if you will have objects of various types, best to explicitly use the object's ID.)
另一方面,如果你想通过值比较列表中的对象,首先你需要定义“值”对于对象的意义。然后需要某种方法将其作为键提供(对于Python 3,作为一致类型)。一种适用于许多任意对象的潜在方法是根据它们的repr()进行排序。当然,这可能会浪费大量额外的时间和内存,为大型列表构建repr()字符串等等。
sorted(a, key=repr) == sorted(b, key==repr)
如果对象都是你自己的类型,你可以在它们上定义__lt__(),这样对象就知道如何将自己与其他对象进行比较。然后你就可以对它们进行排序,而不用担心key=参数。当然,你也可以定义__hash__()并使用Counter,这将更快。