Python 如何使列表索引可互换,如[';a';,';b';,';c';]=[';b';,';a';,&#c';]?

Python 如何使列表索引可互换,如[';a';,';b';,';c';]=[';b';,';a';,&#c';]?,python,list,Python,List,由于['a','b','c']和['b','a','c']具有相同的元素,但是python中的['a','b','c']==['b','a','c']测试返回False 我知道这是由于索引顺序。但是,如何让python认识到列表中的元素实际上是相同的呢 下面是我做的一个未通过测试的示例: def wordset(wordlist): """Return a set of words found in wordlist.""" wordset = [] for i in range(len(wor

由于['a','b','c']和['b','a','c']具有相同的元素,但是python中的['a','b','c']==['b','a','c']测试返回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

无法创建既等于
['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)

不确定这是否真的可以作为一个答案,但如果你只是想检查两个列表之间是否相等,你可以做一些事情

对于列表
list1
list2

使用
set

set(list1) == set(list2)
使用排序后的
将不适用于多个重复元素

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)

如果您想检查两个列表是否具有相同的元素和相同的出现次数,我建议您使用collections.Counter


你也可以像一些人建议的那样使用
set
,但是你会丢失列表中的所有重复项,因此
set(['a','b','b'])==set(['b','a'])
实际上会返回
True

如果你想保持列表的原始顺序,但不考虑顺序来比较它们,那么你可以使用sorted()。这将检查列表中的元素数和出现次数是否相同

x=["a","b","c"]
y=["b","a","c"]

if sorted(x)==sorted(y) # True
对于列表,如果您不关心列表的顺序,可以执行以下操作:

x.sort()
y.sort()
x == y # True

对于列表排序详细信息

您可以通过
.sort()
对列表进行就地排序。您的set函数仍然存在排序问题。将它们转换为
set()
而不是
list()
应该
[a,b,c]==[a,a,b,c]
True
False
?所有和“任何”答案并不总是有效。如果一个列表的元素集是另一个列表的元素集的适当子集,则它们在一个方向回答
True
,在另一个方向回答
False
。你的其他答案很好,这些答案+1。是的,但是你可以改变顺序,为什么我没有明确指定列表。我把它们包括进来只是为了完整
set
是真正应该用于此目的的,前提是重复出现的元素当然仍然意味着相等。
x.sort()
y.sort()
x == y # True