Pracuję nad częścią sztucznej inteligencji w grze w zgadywanie. Chcę, żeby SI wybrała losową literę z tej listy. Robię to jako zestaw, więc mogę łatwo usunąć litery z listy, gdy zostaną odgadnięte w grze i dlatego nie można ich już odgadnąć ponownie.
mówi, że set
obiekt nie jest indeksowalny. Jak mogę to obejść?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
Odpowiedzi:
Uwaga (październik 2020 r.): Od wersji 3.9 Python oficjalnie wycofał
random.sample()
pracę z zestawami, przy czym oficjalne wytyczne dotyczą jawnej konwersji zestawu na listę lub krotkę przed przekazaniem go.>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1) ['f']
Dokumentacja: https://docs.python.org/3/library/random.html#random.sample
źródło
[0]
na końcu, więc jest w zasadzie identyczny zrandom.choice
(który nie zwraca swoich wartości w formie listy)random.sample
robituple(population)
wewnętrznie, więcrandom.choice(tuple(allLetters))
może być lepiej.random.choice
. Jeśli zestaw zmienia się również podczas samplowania, prawdopodobnie nie powinieneś w ogóle używać zestawu. Gdybyś znał zajmowane hashe w zestawie i rozmiary wiadra, łatwo byłoby napisać funkcję próbkowania ...Powinieneś użyć
random.choice(tuple(myset))
, ponieważ jest szybszy i prawdopodobnie czystszy niżrandom.sample
. Napisałem do przetestowania:import random import timeit bigset = set(random.uniform(0,10000) for x in range(10000)) def choose(): random.choice(tuple(bigset)) def sample(): random.sample(bigset,1)[0] print("random.choice:", timeit.timeit(choose, setup="global bigset", number=10000)) # 1.1082136780023575 print("random.sample:", timeit.timeit(sample, setup="global bigset", number=10000)) # 1.1889629259821959
Z liczb wynika, że
random.sample
trwa to 7% dłużej.źródło
random.sample
zmienia się z wolniejszego niżrandom.choice
szybszego, gdy ustawiony rozmiar rośnie (punkt przecięcia znajduje się gdzieś pomiędzy ustawionym rozmiarem 100k-500k). Oznacza to, że im większy zestaw, tym większe prawdopodobieństwo, żerandom.sample
będzie szybszy.