Wie kann man die Reihenfolge der Elemente einer Liste zufällig bestimmen und sicherstellen, dass keine aufeinanderfolgenden Werte gleich sind?

8

Ich habe eine Python-Liste von Strings, sagen wir:

%Vor%

Ich möchte eine neue Liste erstellen, deren Elemente jedes Element von elems in einer zufälligen Reihenfolge eine festgelegte Anzahl von Malen wiederholen (sagen wir zweimal), aber dabei sicherstellen, dass zwei aufeinanderfolgende Elemente niemals denselben Wert haben.

Zum Beispiel ist ["D", "B", "A", "B", "D", "C", "A", "C"] ein gutes Ergebnis. ["D", "B", "A", "B", "D", "C", "C", "A"] ist nicht (C wird an der 6. und 7. Stelle wiederholt).

Die einfachste Idee ist wahrscheinlich nur:

%Vor%

und dann ein Code, der sich um die Wiederholungen kümmert, aber alle Lösungen, die ich mir vorstellen kann, beinhalten potentiell unendliche Schleifen. Gibt es eine einfache und zuverlässige Möglichkeit, dies zu tun?

Danke.

    
Endy 09.04.2014, 12:24
quelle

4 Antworten

5

Ich gehe davon aus, dass die Eingabeliste verschiedene Elemente hat.

%Vor%

Einige Ausgaben:

%Vor%     
YS-L 09.04.2014, 12:57
quelle
1

Sie könnten eine Funktion erstellen, die prüft, ob zwei aufeinanderfolgende Werte in einer Liste x gleich sind:

%Vor%

Dann mische die Liste in einer while -Schleife, bis compareConsecutive() nicht mehr False :

zurückgibt %Vor%

Das kann bei einer langen Liste etwas dauern, da random.shuffle() weiterhin Listen erzeugen kann, die aufeinanderfolgende Werte enthalten, aber es wird schließlich funktionieren:)

    
atlasologist 09.04.2014 12:40
quelle
0

Ich denke, das könnte ein Algorithmus sein, um das zu tun, was Sie wollen:

Lassen Sie R Ihre Ergebnisliste sein

  1. Wählen Sie ein zufälliges Element e von elems und fügen Sie e an R an
  2. Lassen Sie elems_1 = elems \ e , d. h. entfernen Sie e von elems
  3. Wählen Sie ein zufälliges Element e_1 von elems_1 und fügen Sie e_1 an R an
  4. Lassen Sie elems_1 = elems \ e_1 , d. h. entfernen Sie e_1 von elems
  5. Wiederholen Sie Schritt 3, bis R lang genug ist
MarcoS 09.04.2014 12:49
quelle
0

Ich denke, das wird funktionieren, obwohl es nicht so elegant ist.

%Vor%     
zhujs 09.04.2014 13:13
quelle