Estou trabalhando em uma parte de IA de um jogo de adivinhação. Eu quero que o AI selecione uma letra aleatória desta lista. Estou fazendo isso como um conjunto para poder remover facilmente as letras da lista à medida que são adivinhadas no jogo e, portanto, não estão mais disponíveis para serem adivinhadas novamente.
diz que o set
objeto não é indexável. Como posso contornar isso?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
Respostas:
Observação (outubro de 2020): a partir da v3.9, o Python tornou oficialmente obsoleto o
random.sample()
trabalho em conjuntos, com a orientação oficial de converter explicitamente o conjunto em uma lista ou tupla antes de transmiti-lo.>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1) ['f']
Documentação: https://docs.python.org/3/library/random.html#random.sample
fonte
[0]
no final para que seja basicamente idêntico arandom.choice
(que não retorna seus valores na forma de uma lista)random.sample
faztuple(population)
internamente, entãorandom.choice(tuple(allLetters))
pode ser melhor.random.choice
. Se o conjunto também mudar enquanto você faz a amostragem, provavelmente você não deveria usar um conjunto. Se você soubesse os hashes ocupados no conjunto e os tamanhos dos baldes, seria fácil escrever uma função de amostragem ...Você deve usar
random.choice(tuple(myset))
, porque é mais rápido e parece mais limpo do querandom.sample
. Escrevi o seguinte para testar: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
Pelos números, parece que
random.sample
leva 7% a mais.fonte
random.sample
deixa de ser mais lento do querandom.choice
para ser mais rápido do que à medida que o tamanho do conjunto aumenta (o ponto de cruzamento está em algum lugar entre o tamanho do conjunto 100k-500k). Ou seja, quanto maior o conjunto, maior a probabilidaderandom.sample
de ser mais rápido.