Jak posortować listę używając random.shuffle()?

0

Zastanawiam się czemu ten prosty program:

from random import shuffle
cards = ["J", "Q", "K"]
print(shuffle(cards))

Wyświetla None,
kiedy to powinien przestawiać zawartość listy cards.
Może jest tak dla tego, że nie mam pakietu random, podobno to wbudowany pakiet w pythona coś. Ja mam środowisko interpretacji python 3.11
Nawet jak wpisuję polecenie pip install random, jest taki komunikat:

----- Instalowanie „random” -----
ERROR: Could not find a version that satisfies the requirement random (from versions: none)
ERROR: No matching distribution found for random
----- Nie można zainstalować „random” -----

Używam Visual Studio 2022...
Coś jest nie tak, bo w dokumentacji pythona jest pakiet random z opcją shuffle...

50

Bo shuffle nic nie zwraca tylko mutuje obiekt.

0

Dokladnie jak wyzej.
zrob shuffle, nastepnie wyprintuj swoja liste

2
Michał Motyl napisał(a):

Coś jest nie tak, bo w dokumentacji pythona jest pakiet random z opcją shuffle...

Może powinieneś uważniej czytać tą dokumentację?

0

OK uważniej doczytałem w dokumentacji i pisze tam by zastąpić shuffle opcją: sample(x, k=len(x)). Po prostu od wersji 3.11 Pythona nie ma już shuffle...

A czy shufle zwraca czy nie zwraca cokolwiek to pewnie zwraca więc twierdzenie "Bo shuffle nic nie zwraca tylko mutuje obiekt." Nie zbyt pomogło.
Teraz użyłem sample i działa dzięki za pomoc

from random import sample
cards = ["J", "Q", "K"]
print(sample(cards, k=len(cards)))
2

Niedawno na Mikrobloga dodałem kod używający shuffle().
Wrzucam dla odmiany, żeby na...

Jak widzisz, nigdzie nie przypisuję zwracanej wartości.

5
Michał Motyl napisał(a):

OK uważniej doczytałem w dokumentacji i pisze tam by zastąpić shuffle opcją: sample(x, k=len(x)). Po prostu od wersji 3.11 Pythona nie ma już shuffle...

Co? Jak najbardziej jest: https://docs.python.org/3.11/library/random.html?highlight=shuffle#random.shuffle

W wersji 3.11 usunięto opcjonalny parametr random. Wcześniej sygnatura tej funkcji wyglądała tak: random.shuffle(x[, random]), gdzie random, o ile był dostarczony i był bezparametrową funkcją zwracającą floata z zakresu [0.0, 1.0), był wykorzystywany jako źródło losowości.

Uwaga _13th_Dragona o uważnym czytaniu dokumentacji jest jak najbardziej na miejscu.

A o co chodzi i z czego wynika Twój błąd? Tak jak Ci tu już pisali, i co stwierdza dokumentacja w pierwszej linijce — „Shuffle the sequence x in place.” (wyróżnienie moje)

Ta funkcja nic nie zwraca. Ona sortuje dostarczoną jej kolekcję w miejscu. Próba wyprintowania jej rezultatu — którym jest None, zawsze i wszędzie — jest nonsensowna. Poprawne użycie to, na przykład, wyprintowanie tej kolekcji po potasowaniu:

kolekcja = [1, 2, 3, 4, 5, 6, 7, 8]
print(kolekcja)  # [1, 2, 3, 4, 5, 6, 7, 8]
shuffle(kolekcja)  # zwraca None — możesz sprawdzić przez assert shuffle(kolekcja) is None
print(kolekcja)  # [5, 7, 1, 3, 8, 4, 2, 6] ← wynik, oczywiście, może się różnić

Analogicznie działa zresztą sort().

Jakby jakaś funkcja została usunięta, to Python rzuciłby wyjątek NameError:

nie_ma_takiej_funkcji(kolekcja)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'nie_ma_takiej_funkcji' is not defined
45
Michał Motyl napisał(a):

A czy shufle zwraca czy nie zwraca cokolwiek to pewnie zwraca więc twierdzenie "Bo shuffle nic nie zwraca tylko mutuje obiekt." Nie zbyt pomogło.

Co w tym nie rozumiesz? Możesz to sprawdzić samemu, albo tak jak pisał @_13th_Dragon zacząć czytać ze zrozumieniem.

4

Zawsze możesz sobie napisać funkcję jak koniecznie chcesz aby shuffle coś zwracało.

import random

def rshuffle(lst):
    lst=lst.copy()
    random.shuffle(lst)
    return lst

tb=[2,3,5,7,11,13]
print(rshuffle(tb))
print(tb)
0

Jak posortować listę używając random.shuffle()?

>>> import random
>>> def bogosort(a):
...   def is_sorted(a):
...     n=len(a)
...     for i in range(1,n):
...       if a[i-1]>a[i]:
...         return 0
...     return 1
...   while not is_sorted(a):
...     random.shuffle(a)
>>> a=[4,2,5,1,3]
>>> bogosort(a)
>>> a
[1, 2, 3, 4, 5]
>>> 
0

A może w zależności od mutowania tablicy pierwszej decyzyjnej, tablica z kartami ulega mutowaniu albo sortowaniu:

from random import shuffle
class AI:
    def __init__(self):
        self.the_board = [0, 1]
        self.the_cards = ["J", "Q", "K", "A"]
        print(self.the_cards)
        shuffle(self.the_board)
        print(self.the_board)
        for i in self.the_board:
            if self.the_board[i] == 1:
                    shuffle(self.the_cards)
            else: 
                    self.the_cards.sort()
        print(self.the_cards)
finish = AI()
print(finish)

Tylko w wyniku mam na spodzie dodatkowy napis:

['J', 'Q', 'K', 'A']
[1, 0]
['Q', 'A', 'J', 'K']
<__main__.AI object at 0x015D44D0>

Ale działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1