Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man die von itertools.combinations() generierten Tupel effizient verschlüsseln?
Ich verwende itertools.combinations()
, um eine Liste von Tupeln mit zwei Elementen basierend auf einer Liste sich nicht wiederholender Elemente zu generieren. Dann mische ich die resultierende Liste. Der Inhalt des Tupels selbst ist jedoch chronologisch organisiert. Führen Sie beispielsweise den folgenden Code aus:
import random import itertools items = ["a","b","c","d","e"] item_combos = list(itertools.combinations(items, 2)) random.shuffle(item_combos) print(item_combos)
Ausgabe:
['a', 'b', 'c', 'd', 'e'] [('b', 'd'), ('a', 'e'), ('b', 'c'), ('a', 'd'), ('a', 'b'), ('a', 'c'), ('c', 'e'), ('c', 'd'), ('b', 'e'), ('d', 'e')]
Zeichen werden im Tupel nach dem Zeitpunkt sortiert, zu dem sie in der Eingabeliste erschienen (nicht alphabetisch, die Eingabeliste ist zufällig nur alphabetisch sortiert. Das Mischen der Liste löst das Problem nicht, es verbirgt es nur). „c“ erscheint immer links von „d“ und „a“ erscheint immer links von allem anderen.
Meine Lösung bestand darin, einfach alle Tupel durch verschlüsselte Tupel zu ersetzen (siehe unten). Dies funktioniert, erweist sich jedoch als sehr langsam, insbesondere bei größeren Listen.
for i in range(len(item_combos)): item_combos[i] = tuple(random.sample(item_combos[i], 2))
Gibt es eine schnellere Möglichkeit, eine ähnliche Ausgabe zu erzeugen?
Das Auswählen zufälliger Tupel zum Umkehren, anstatt jedes Tupel zu mischen, funktioniert viel schneller. Dies hat das gleiche Ergebnis, da jedes Tupel in item_combos
nur zwei Elemente enthält.
Neuer Tupel-„Scrambling“-Code:
for i in range(len(item_combos)): if random.random()<.5: item_combos[i] = item_combos[i][::-1]
Das obige ist der detaillierte Inhalt vonWie kann man die von itertools.combinations() generierten Tupel effizient verschlüsseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!