Set iteration Reihenfolge variiert von run zu run
Warum die iteration, um Python-set (mit gleichem Inhalt) variieren von Lauf zu Lauf, und was sind meine Möglichkeiten, für die es im Einklang von run zu run?
Ich verstehe, dass die iteration, um für ein Python set ist beliebig. Wenn ich 'a', 'b' und 'c' in einem Satz und dann Durchlaufen Sie, Sie können kommen zurück in beliebiger Reihenfolge.
Was ich beobachtet habe ist, dass die Reihenfolge gleich bleibt innerhalb eines von der Anwendung ausgeführt werden. Das ist, wenn mein Programm wiederholt den gleichen Satz zweimal hintereinander, bekomme ich die gleiche Reihenfolge, beide Male. Allerdings, wenn ich das Programm zweimal in einer Zeile, die Reihenfolge ändert sich von run zu run.
Leider bricht einer meiner automatisierten tests, welche einfach vergleicht die Ausgabe von zwei runs von meinem Programm. Ich kümmern sich nicht um die eigentliche Ordnung, aber ich möchte es konsistent sind.
Die beste Lösung, die ich mir ausgedacht habe ist:
- Kopieren Sie das set, um eine Liste.
- Wenden Sie eine beliebige Sortierung der Liste.
- Durchlaufen der Liste anstelle des Satzes.
Gibt es eine einfachere Lösung?
Hinweis: ich habe festgestellt, ähnliche Fragen auf StackOverlow, aber keine, die Adresse dieses Problem, immer die gleichen Ergebnisse sind.
- Wenn das, was du bist Tests ist, dass "das Programm gibt die gleiche Sache beide Male', die sortierte Liste option ist Ihre beste Wette. Wenn das, was Sie testen, ist, dass 'das Programm erstellt den gleichen Satz beide Male', Sie benötigen dazu eine set-Vergleich (durch einlegen der Leistung der beiden läuft, dann unpickling die Ausgabe der beiden und set-vergleicht diese, oder etwas moralisch gleichwertig).
- Ich habe die unit-tests, die überprüfen den set-Inhalt. Aber ich habe auch diesen test, vergleicht die Ausgabe von zwei läuft wie eine Plausibilitätsprüfung. Die Ausgabe abhängig ist, in Teil, auf die Reihenfolge der Elemente in einem Satz, aber nur auf Umwegen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie wollen, ist nicht möglich. Willkürlich bedeutet willkürlich.
Meine Lösung wäre die gleiche wie bei Ihnen, haben Sie zu Sortieren, wenn Sie wollen in der Lage sein, um es zu vergleichen zu einem anderen.
sorted()
auf eine bequeme Art zu schreiben, die 3 Schritte.Verwenden Sie die symmetric_difference ( ^ ) - operator auf Ihre zwei Sätze, um zu sehen, ob es irgendwelche Unterschiede gibt:
Den Grund der set-iteration, um Veränderungen von Lauf-zu-Lauf zu sein scheint, weil Python verwendet hash-seed-Randomisierung standardmäßig. (Siehe Befehl option
-R
.) Somit iteration ist nicht nur willkürlich ist (wegen Vermischung), aber auch nicht deterministisch (wegen der zufälligen Streuung).Können Sie überschreiben die zufällige Streuung mit einem festen Wert durch das setzen der Umgebungsvariablen PYTHONHASHSEED für den Dolmetscher. Mit den gleichen Samen von Lauf zu Lauf bedeutet-set iteration ist immer noch willkürlich, aber jetzt ist es deterministisch ist, welche die gewünschte Eigenschaft.
Hash-seed Randomisierung ist eine Sicherheitsmaßnahme, die machen es schwierig für einen Gegner, um feed-Eingaben, die bewirken, dass krankhaftes Verhalten (z.B. durch die Schaffung von zahlreichen hash-Kollisionen). Für unit-Tests ist dies nicht von Belang, so ist es sinnvoll, überschreiben Sie die hash-Samen während der Ausführung von tests.
Den set ' s iteration um, hängt nicht nur seinen Inhalt, sondern auf die Reihenfolge, in der die Elemente eingefügt wurden, in den Satz, und ob es wurden Streichungen entlang der Weise. So können Sie zwei verschiedene sets mit unterschiedlichen Insertionen und Deletionen, und enden mit dem gleichen Satz am Ende, aber mit unterschiedlichen iteration Aufträge.
Wie schon andere gesagt haben: wenn Sie kümmern sich um die Reihenfolge der gesetzt ist, müssen Sie erstellen eine sortierte Liste von it.
Ihre Frage verwandelt sich in zwei Fragen: A) wie vergleichen "der Ausgang der beiden Läufe" in Ihrem speziellen Fall; B) was ist die definition der iteration, um in einem set. Vielleicht sollte man Sie unterscheiden und post B) als eine neue Frage, wenn angemessen. Ich Antworte A.
IMHO, mit einer sortierten Liste in Ihrem Fall ist keine sehr saubere Lösung. Sie sollten entscheiden, ob Sie Pflege für die iteration, um ein für alle mal und verwenden Sie die entsprechende Struktur.
Entweder 1) Sie wollen die vergleichen Sie die beiden Gruppen zu sehen, ob Sie haben den gleichen Inhalt, unabhängig von der Reihenfolge. Dann einfach = = - operator auf Mengen geeignet scheint. Sehen python2-sets, Python ist3 setzt.
Oder 2) Sie wollen überprüfen, ob die Elemente eingefügt wurden, in der gleichen Reihenfolge. Aber dies scheint vernünftig, nur, wenn die Reihenfolge der Einfügemarke irgendwie wichtig ist, um den Nutzern Ihrer Bibliothek, in dem Fall mit der set-Typ war wahrscheinlich unpassend, um mit zu beginnen. Anders ausgedrückt, es ist unklar, was Sie genau meinen "Vergleich der Leistung von zwei Folgen" und warum Sie das tun wollen.
In allen Fällen, ich bezweifle, dass eine sortierte Liste ist hier angebracht.
Können Sie die Ergebnis erwartet werden auch eine Reihe. Und prüft, ob diese beiden Mengen sind gleich mit ==.
Im Gegensatz zu sets, Listen haben Sie immer eine garantierte Reihenfolge, so dass Sie könnte werfen Sie den Satz und verwenden Sie die Liste.