由于['a','b','c']和['b','a','c']具有相同的元素,但是['a','b','c'] == ['b','a','c']在python中测试返回False。
据我所知,这是由于索引序列。但是如何让python认识到列表中的元素实际上是相同的呢?
以下是我在测试中失败的一个例子:
def wordset(wordlist):
"""Return a set of words found in wordlist."""
wordset = []
for i in range(len(wordlist)):
if wordlist[i] not in wordset:
wordset.append(wordlist[i])
return wordset
In: wordset(['now', 'is', 'time', 'is', 'now', 'is', 'is']) == ['is', 'now', 'time']
Out: False
答案 0 :(得分:2)
无法创建与['a', 'b', 'c']
和['b', 'a', 'c']
相同的常规列表。如果您需要==
比较的特殊语义,您可能需要编写自己的类型:
class wordset(object):
def __init__(self, words):
self.words = set(words)
def __eq__(self, other):
if isinstance(other, wordset):
return self.words == other.words
return self.words == set(other)
答案 1 :(得分:2)
不确定这是否真的有资格作为答案,但如果您只是想检查两个列表之间的相等性,那么您可以做几件事。
对于列表list1
和list2
:
使用set
set(list1) == set(list2)
使用sorted
,无法使用多个重复元素
sorted(list1) == sorted(list2)
使用all
all(x in list2 for x in list1):
使用any
not any(x for x in list2 if x not in list1)
答案 2 :(得分:1)
如果你想检查两个列表是否具有相同的元素和相同的出现次数我建议你使用collections.Counter https://docs.python.org/2/library/collections.html#collections.Counter
def are_equal(list_a, list_b):
return Counter(list_a) == Counter(list_b)
您也可以像某些人建议的那样使用set
但是您会丢失列表中的所有重复内容,因此set(['a', 'b', 'b']) == set(['b', 'a'])
实际上会返回True
答案 3 :(得分:1)
如果您希望将列表保留在原始订单中,但在不考虑订单的情况下进行比较,则可以使用sorted()。这将检查您的列表是否具有相同数量的元素和相同的出现次数。
x=["a","b","c"]
y=["b","a","c"]
if sorted(x)==sorted(y) # True
对于列表,如果您不关心列表的顺序,则可以执行以下操作:
x.sort()
y.sort()
x == y # True