我正在研究猜谜游戏的AI部分。我希望AI从这个列表中选择一个随机字母。我这样做是为了让我可以轻松地删除列表中的字母,因为它们在游戏中被猜到了,因此再也无法猜到了。
它说set
对象不可索引。我该如何解决这个问题?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
答案 0 :(得分:71)
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1)
['f']
文档:https://docs.python.org/3/library/random.html#random.sample
答案 1 :(得分:42)
你应该使用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%的时间。
答案 2 :(得分:1)
您可以通过使用 list
而不是 set
来解决此问题。您仍然可以“轻松”从列表中删除字母。试试这个,例如:
allLetters = list('abcdefghijklmnopqrstuvwxyz')
aiGuess = random.choice(allLetters)
allLetters.remove(aiGuess)
另一种选择是随机选择索引而不是字母,这可能会稍微快一点,因为我们不需要搜索要删除的元素(但我怀疑这里的速度是否真的很重要?):>
allLetters = list('abcdefghijklmnopqrstuvwxyz')
index = random.randint(0, len(allLetters)-1) # Top is inclusive, unlike slices
aiGuess = allLetters[index]
del allLetters[index]
答案 3 :(得分:1)
由于选择列表不是很长,可以先使用random.shuffle列表。然后迭代列表中的每个元素。这样可以避免从列表中一个一个地删除元素并使您的代码更简洁。
答案 4 :(得分:1)
如果你想从集合中获取一个随机元素。
a = set()
for i in range(10):
a.add(i)
a.pop() // gives a random element from a set