2009-06-20 11 views
67

Otrzymuję jako dane wejściowe listę ciągów znaków i muszę zwrócić listę z tymi samymi ciągami, ale w kolejności losowej. Muszę pozwolić na duplikaty - ten sam ciąg może pojawić się raz lub więcej w danych wejściowych i musi pojawić się taką samą liczbę razy w danych wyjściowych.Najlepszy sposób losowania listy ciągów w Pythonie

Widzę kilka sposobów "brutalnej siły" robienia tego (używając pętli, nie daj Boże), z których aktualnie korzystam. Jednak, wiedząc, że Python jest pewnie fajny, jeden liniowiec nie wykonuje zadania, prawda?

+0

Możliwy duplikat [Shuffling listę obiektów w python] (http://stackoverflow.com/questions/ 976882/shuffling-a-list-of-objects-in-python) –

Odpowiedz

175
>>> import random 
>>> x = [1, 2, 3, 4, 3, 4] 
>>> random.shuffle(x) 
>>> x 
[4, 4, 3, 1, 2, 3] 
>>> random.shuffle(x) 
>>> x 
[3, 4, 2, 1, 3, 4] 
+1

random.shuffle (zakres (5)) .. nie wydaje się do pracy z listą generowaną w locie :( – user1019129

+6

@ user1019129 'random.shuffle' tasuje listy w miejscu.W Pythonie 3' range (5) 'jest generatorem, a nie listą.W Pythonie 2,' range (5) 'to lista, bu t shuffle jest na miejscu, więc tasuje tymczasową listę, która jest natychmiast odrzucana. Możesz zrobić "x = zasięg (5); random.shuffle (x) ', a następnie użyj' x'. –

3

Musisz przeczytać ciągi do tablicy, a następnie użyć algorytm tasowania. Polecam Fisher-Yates shuffle

+0

Na podstawie skrótu do artykułu z Wikipedii wygląda na to, że to mniej więcej to, co robi. Możesz przeczytać kod w C: \ Python26 \ Lib \ random.py (lub odpowiednik dla innych systemów operacyjnych) i wygląda na to, że robi to samo, co tutaj opisano: http://en.wikipedia.org/wiki/Fisher%E2 % 80% 93Yates_shuffle # Modern_method – MatrixFrog

4

Biorąc pod uwagę ciąg element, tutaj jest jeden-liner:

''.join([str(w) for w in random.sample(item, len(item))]) 
Powiązane problemy