Mam listę obiektów i chcę je przetasować. Myślałem, że mogę użyć tej random.shuffle
metody, ale wydaje się, że zawodzi, gdy lista obiektów. Czy istnieje metoda tasowania obiektów lub w inny sposób?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
To się nie powiedzie.
Odpowiedzi:
random.shuffle
powinno działać. Oto przykład, w którym obiektami są listy:Pamiętaj, że losowanie działa w miejscu i zwraca Brak.
źródło
random
dokumentacji modułu .random.sample(x, len(x))
lub po prostu zrobić kopię ishuffle
to. Dlalist.sort
których występuje podobny problem, jest terazlist.sorted
, ale nie ma podobnego wariantushuffle
.from random import SystemRandom
zamiast tego; dodajcryptorand = SystemRandom()
i zmień wiersz 3 nacryptorand.shuffle(x)
Jak się dowiedziałeś, problemem było tasowanie w miejscu. Często też mam problem i często zapominam, jak również skopiować listę. Zastosowanie
sample(a, len(a))
to rozwiązanie, użycielen(a)
jako wielkości próbki. Zobacz https://docs.python.org/3.6/library/random.html#random.sample celu uzyskania dokumentacji Pythona.Oto prosta wersja,
random.sample()
która zwraca losowy wynik jako nową listę.źródło
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(zamień; na nowe linie)old[:]
może również zrobić płytką kopię listyold
.sample()
jest szczególnie pomocny przy tworzeniu prototypów analizy danych.sample(data, 2)
do ustawienia kodu kleju rurociągu, a następnie „poszerzenia” go krok po kroku, dolen(data)
.Zajęło mi to również trochę czasu. Ale dokumentacja losowania jest bardzo przejrzysta:
Więc nie powinieneś
print(random.shuffle(b))
. Zamiast tego zróbrandom.shuffle(b)
i wtedyprint(b)
.źródło
źródło
Jeśli zdarzyło Ci się już używać Numpy (bardzo popularny w zastosowaniach naukowych i finansowych), możesz zaoszczędzić sobie importu.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
źródło
Działa dla mnie dobrze. Pamiętaj, aby ustawić metodę losową.
źródło
Jeśli masz wiele list, możesz najpierw zdefiniować permutację (sposób tasowania listy / zmiany kolejności elementów na liście), a następnie zastosować ją do wszystkich list:
Numpy / Scipy
Jeśli twoje listy są tablicami liczbowymi, jest to prostsze:
MPU
Stworzyłem mały pakiet narzędziowy,
mpu
który maconsistent_shuffle
funkcję:Zauważ, że
mpu.consistent_shuffle
pobiera dowolną liczbę argumentów. Możesz więc przetasować z nim co najmniej trzy listy.źródło
Ta alternatywa może być przydatna w niektórych aplikacjach, w których chcesz zamienić funkcję zamawiania.
źródło
sorted
temu jest to funkcjonalne tasowanie (jeśli lubisz takie rzeczy).W niektórych przypadkach przy użyciu tablic numpy, przy użyciu
random.shuffle
utworzonych duplikatów danych w tablicy.Alternatywą jest użycie
numpy.random.shuffle
. Jeśli już pracujesz z Numpy, jest to metoda preferowana w stosunku do ogólnejrandom.shuffle
.numpy.random.shuffle
Przykład
Używanie
random.shuffle
:Używanie
numpy.random.shuffle
:źródło
numpy.random.permutation
mogą być interesujące: stackoverflow.com/questions/15474159/shuffle-vs-permute-numpyrandom.shuffle
Dokumentacja powinna krzyczeć Nie używać z NumPy tablicW przypadku jedno-liniowych użyj
random.sample(list_to_be_shuffled, length_of_the_list)
na przykład:wyjścia: [2, 9, 7, 8, 3, 0, 4, 1, 6, 5]
źródło
„print func (foo)” wydrukuje zwracaną wartość „func”, gdy zostanie wywołany z „foo”. „shuffle” ma jednak None jako typ zwracany, ponieważ lista zostanie zmodyfikowana w miejscu, dlatego nic nie drukuje. Obejście:
Jeśli bardziej interesujesz się funkcjonalnym stylem programowania, możesz zastosować następującą funkcję otoki:
źródło
random.sample(ls, len(ls))
jeśli naprawdę chcesz zejść tą drogą.Można zdefiniować funkcję o nazwie
shuffled
(w tym samym sensiesort
vssorted
)źródło
shuffle
jest na miejscu, więc nie drukuj wyniku, który jestNone
, ale listę.źródło
Możesz to zrobić:
jeśli chcesz wrócić do dwóch list, podziel tę długą listę na dwie.
źródło
możesz zbudować funkcję, która pobiera listę jako parametr i zwraca losową wersję listy:
źródło
źródło
możesz użyć losowania lub próbki. oba pochodzą z losowego modułu.
LUB
źródło
Upewnij się, że nie nazywasz pliku źródłowego random.py i że w katalogu roboczym nie ma pliku o nazwie random.pyc .. albo może spowodować, że Twój program spróbuje zaimportować lokalny plik random.py zamiast losowego modułu pytonów .
źródło
źródło
_list.extend(list2)
, która jest bardziej zwięzła ORAZ bardziej wydajna.źródło
Proces tasowania odbywa się „z wymianą” , więc występowanie każdego elementu może ulec zmianie! Przynajmniej wtedy, gdy pozycje na liście również są na liście.
Na przykład,
Po,
Liczba [0] może wynosić 9 lub 8, ale nie dokładnie 10.
źródło
Plan: wypisz losowanie bez polegania na bibliotece, aby wykonać ciężkie podnoszenie. Przykład: Przejrzyj listę od początku, zaczynając od elementu 0; znajdź dla niego nową losową pozycję, powiedzmy 6, umieść wartość 0 w 6, a wartość 6 w 0. Przejdź do elementu 1 i powtórz ten proces, i tak dalej przez resztę listy
źródło
my_list[i], my_list[j] = my_list[j], my_list[i]
To działa dobrze. Próbuję go tutaj z funkcjami jako obiektami listy:
Drukuje: foo1 foo2 foo3 foo2 foo3 foo1 (foos w ostatnim rzędzie mają losową kolejność)
źródło