2016-05-08 15 views
2

Da [ 'a', 'b', 'c'] und [ 'B', 'a', 'c'] die gleichen Elemente, aber [ 'a', 'b', 'c'] = = ['b', 'a', 'c'] Test in Python gibt False zurück.Wie Liste Indizes austauschbar, wie in [ 'a', 'b', 'c'] == [ 'b', 'a', 'c'] machen?

Ich verstehe, dass diese zu indizieren Sequenz zurückzuführen ist. Aber wie macht man Python erkennen, dass tatsächlich die Elemente in der Liste identisch sind? Hier

ist ein Beispiel, das ich tat, den Test nicht bestanden:

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

Sie könnten die Listen an Ort und Stelle sortieren über '.sort()'. Ihre Set-Funktion wird weiterhin das Bestellproblem haben. – schwobaseggl

+0

wandeln sie in 'set()' statt 'Liste()' –

+4

Sollte '[a, b, c, c] == [a, a, b, c]' 'seine true' oder' false'? – schwobaseggl

Antwort

2

Es gibt keine Möglichkeit, eine regelmäßige Liste zu erstellen, die sowohl zu gleich sein ['a', 'b', 'c'] und ['b', 'a', 'c']. Wenn Sie spezielle Semantik für == Vergleiche benötigen, müssen Sie wahrscheinlich Ihre eigene Art schreiben:

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) 
2

nicht sicher, ob dies wirklich als Antwort qualifiziert, aber wenn man einfach versuchen, ist für die Gleichstellung zwischen den beiden Listen überprüfen Sie können ein paar Dinge tun.

Für Listen list1 und list2:

Verwenden set

set(list1) == set(list2) 

Verwendung sorted, nicht für mehrere wiederkehrende Elemente arbeiten

sorted(list1) == sorted(list2) 

Verwenden all

all(x in list2 for x in list1): 

Verwenden any

not any(x for x in list2 if x not in list1) 
+0

Die Antworten "alle" und "alle" funktionieren nicht immer.Sie antworten beide "Wahr" in einer Richtung und "Falsch" in der anderen Richtung, wenn die Menge von Elementen einer Liste eine richtige Teilmenge der Menge von Elementen der anderen Liste ist. Ihre anderen Antworten sind nett, +1 für diejenigen. –

+0

Ja, aber Sie können die Reihenfolge ändern, warum ich die Listen nicht explizit angegeben habe. Ich habe sie nur der Vollständigkeit halber aufgenommen. 'set' ist das, was wirklich dafür verwendet werden sollte, vorausgesetzt, wiederkehrende Elemente bedeuten immer noch Gleichheit. – Pythonista

1

Wenn Sie überprüfen wollen, ob zwei Listen die gleichen Elemente haben und die gleiche Anzahl von Vorkommen Ich schlage vor, Sie verwenden ein 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) 

Sie set wie manche Leute auch vorschlagen, verwenden könnte, aber Sie werden alle Duplikate in der Liste verlieren, so set(['a', 'b', 'b']) == set(['b', 'a']) kehrt tatsächlich True

1

Wenn Sie Ihre Listen in ihren ursprünglichen Aufträge zu halten, aber sie ohne Rücksicht vergleichen dann bestellen Sie sortierten können (verwenden). Dadurch wird überprüft, ob Ihre Listen die gleiche Anzahl von Elementen und die gleiche Anzahl von Vorkommen haben.

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

if sorted(x)==sorted(y) # True 

Für Listen, wenn Sie Sie können nicht über die Reihenfolge der Liste Pflege tun:

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

https://docs.python.org/3/howto/sorting.html für Listensortierung Angaben

Verwandte Themen