Python 如何使列表索引可互换,如[';a';,';b';,';c';]=[';b';,';a';,c';]?
由于['a','b','c']和['b','a','c']具有相同的元素,但是python中的['a','b','c']==['b','a','c']测试返回False 我知道这是由于索引顺序。但是,如何让python认识到列表中的元素实际上是相同的呢 下面是我做的一个未通过测试的示例: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
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