Python: Bestimmen Sie, ob eine unsortierte Liste in einer Liste der Listen enthalten ist, unabhängig von der Reihenfolge der Elemente

Ich habe eine ähnliche Frage zu dieser Frage: Bestimmen Sie, ob 2 Listen die gleichen Elemente haben, unabhängig von der Bestellung?

Was ist der beste / schnellste Weg, um festzustellen, ob eine unsortierte list1 in einer Liste der Listen enthalten ist, myListOfLists , unabhängig von der Reihenfolge der Elemente in list1 ? Mein Versuch ist verpackt in der Funktion doSomething(...) die ich oft doSomething(...) :

 def doSomething(myListOfLists, otherInputs): list1 = [] ... # do something here with `otherInputs' ... # which gives `list1' some values # now only append `list1' to `myListOfLists' if it doesn't already exist # and if it does exist, remove it removeFromList = False for myList in myListOfLists: if sorted(list1) == sorted(myList): removeFromList = True break if removeFromList: myListOfLists.remove(list1) else: myListOfLists.append(list1) return myListOfLists 

Das Problem damit ist, dass ich die Funktion doSomething(...) ca. 1.0e5 mal laufen muss. Als myListOfLists wird mit jedem Aufruf von doSomething(...) größer doSomething(...) dies massiv zeitraubend.

BEARBEITEN:

Manche Klärung der Aufgabe. Lassen Sie mich hier ein Beispiel für die gewünschte Ausgabe geben:

 a = [] doSomething(a, [1,2,3]) >> a = [1,2,3] 

Weil [1,2,3] nicht in a , wird es an a .

 doSomething(a, [3,4,5]) >> a = [[1,2,3], [3,4,5]] 

Weil [3,4,5] nicht in a , wird es an a .

 doSomething(a, [1,2,3]) >>[3,4,5] 

Weil [1,2,3] in a , wird es aus a .

BEARBEITEN:

Alle Listen haben die gleiche Länge.

  • Wird ein Python mit Ganzzahlen diktiert als Schlüssel werden natürlich sortiert?
  • Python Sortiert: Sortierung eines Wörterbuchs nach Wert (DESC) dann per Schlüssel (ASC)
  • Sortieren eines Wörterbuchs in Python mit einer Liste der bestellten Schlüssel
  • Wie man per Schlüssel (alphabetisch) in defaultdict (Liste) für einen invertierten Index anordnet
  • Über Pythons eingebaute Art () -Methode
  • Wie bekomme ich Indizes eines sortierten Arrays in Python
  • Versuchen, die x häufigsten Wörter in einer Textdatei auszugeben
  • Zusammenführen von zwei sortierten verknüpften Listen in eine verknüpfte Liste in python
  • 4 Solutions collect form web for “Python: Bestimmen Sie, ob eine unsortierte Liste in einer Liste der Listen enthalten ist, unabhängig von der Reihenfolge der Elemente”

    Sie können hier Sets verwenden:

     def doSomething(myListOfLists, otherInputs): s = set(otherInputs) #create set from otherInputs for item in myListOfLists: #remove the common items between `s` and current sublist from `s`. s -= s.intersection(item) #if `s` is empty, means all items found. Return True if not s: return True return not bool(s) ... >>> doSomething([[1, 2, 7],[6, 5, 4], [10, 9, 10]], [7, 6, 8]) False >>> doSomething([[1, 2, 7],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) True 

    Update 1: Jede Unterliste enthält genau dieselben Elemente wie otherInputs .

     def doSomething(myListOfLists, otherInputs): s = set(otherInputs) return any(set(item) == s for item in myListOfLists) ... >>> doSomething([[6, 8, 7],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) True >>> doSomething([[1, 2, 7],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) False 

    Update 2: otherInputs ist eine Teilmenge einer der Unterliste:

     def doSomething(myListOfLists, otherInputs): s = set(otherInputs) return any(s.issubset(item) for item in myListOfLists) ... >>> doSomething([[6, 8, 7],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) True >>> doSomething([[6, 8, 7, 10],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) True >>> doSomething([[1, 2, 7],[6, 5, 4], [10, 8, 10]], [7, 6, 8]) False 

    Sätze verwenden

     def doSomething(myDictOfLists, otherInputs): list1 = [] ... # do something here with `otherInputs' ... # which gives `list1' some values # now only append `list1' to `myListOfLists' if it doesn't already exist # and if it does exist, remove it list1Set = set(list1) if list1Set not in myDictOfLists: myDictOfLists[list1Set] = list1 return myDictOfLists 

    Wenn du die angegebene Liste myListOfLists hast und dann an myListOfLists , myListOfLists du folgendes verwenden:

     if sorted(list1) in myListOfLists: 

    Dieser Algorithmus scheint etwas schneller zu sein:

     l1 = [3, 4, 1, 2, 3] l2 = [4, 2, 3, 3, 1] same = True for i in l1: if i not in l2: same = False break 

    Für 1000000 Loops, das dauert 1.25399184227 sec auf meinem Computer, während

     same = sorted(l1) == sorted(l2) 

    Nimmt 1.9238319397 Sek.

    Python ist die beste Programmiersprache der Welt.