Я работаю над частью игры в угадайку, связанной с искусственным интеллектом. Я хочу, чтобы ИИ выбрал случайную букву из этого списка. Я делаю это как набор, поэтому я могу легко удалять буквы из списка, поскольку они угадываются в игре и поэтому больше не доступны для повторного угадывания.
он говорит, что set
объект не индексируется. Как я могу обойти это?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
Ответы:
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1) ['f']
Документация: https://docs.python.org/3/library/random.html#random.sample
источник
[0]
в конце, так что он в основном идентиченrandom.choice
(который не возвращает его значения в виде списка)random.sample
делаетtuple(population)
внутренне, так чтоrandom.choice(tuple(allLetters))
может быть лучше.random.choice
. Если набор также меняется во время отбора проб, то, вероятно, вам вообще не следует использовать набор. Если бы вы знали занятые хэши в наборе и размеры ведра, было бы легко написать функцию выборки ...Вы должны использовать
random.choice(tuple(myset))
, потому что он быстрее и, возможно, чище, чемrandom.sample
. Я написал для проверки следующее: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
Судя по цифрам, это
random.sample
занимает на 7% больше времени.источник
random.sample
переходит от медленнее, чемrandom.choice
к скорости, по мере увеличения размера набора (точка пересечения находится где-то между размером набора 100k-500k). То есть, чем больше набор, тем больше вероятность, что онrandom.sample
будет быстрее.