Note: Use the random. choice() function if you want to choose only a single item from the list. Generate n unique samples (multiple items) from a sequence without repetition. Here, A seq can be a list , set , string , tuple .
In earlier version of python, the order of pop is definite, in recent python version, the set object(also for dict) is insertion ordered. in both case, the result of pop is predictable, thus not random.
The Python set pop() method is a function that removes a random element from a set. In Python, the pop() function returns the element that was randomly removed.
Note (Oct. 2020): as of v3.9, Python has officially deprecated random.sample()
working on sets, with the official guidance being to explicitly convert the set to a list or tuple before passing it in, though this doesn't solve the efficiency problems.
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1)
['f']
Documentation: https://docs.python.org/3/library/random.html#random.sample
Note that choosing random elements from a set is extremely inefficient no matter how you do it - it takes time proportional to the size of the set, or worse if the set's underlying hash table is sparse due to removed elements.
Instead, you should probably use a different data structure that supports this operation efficiently.
You should use random.choice(tuple(myset))
, because it's faster and arguably cleaner looking than random.sample
. I wrote the following to test:
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
From the numbers it seems that random.sample
takes 7% longer.
If you want to get a random element from the set.
a = set()
for i in range(10):
a.add(i)
a.pop() // gives a random element from a set
You could work around this by using a list
instead of a set
. You will still be able to remove letters "easily" from the list. Try this, for example:
allLetters = list('abcdefghijklmnopqrstuvwxyz')
aiGuess = random.choice(allLetters)
allLetters.remove(aiGuess)
Another option is to randomly choose the index instead of the letter, which might be slightly faster since we don't need to search for the element to delete (but I'd question if speed actually matters here?):
allLetters = list('abcdefghijklmnopqrstuvwxyz')
index = random.randint(0, len(allLetters)-1) # Top is inclusive, unlike slices
aiGuess = allLetters[index]
del allLetters[index]
Since the choice list is not very long, you can use random.shuffle the list first. Then iterate each element from the list. This avoid removing element from a list one by one and make your code cleaner.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With