来自set的选择?蟒蛇

时间:2013-04-05 15:26:04

标签: python list set

我正在研究猜谜游戏的AI部分。我希望AI从这个列表中选择一个随机字母。我这样做是为了让我可以轻松地删除列表中的字母,因为它们在游戏中被猜到了,因此再也无法猜到了。

它说set对象不可索引。我该如何解决这个问题?

import random 
aiTurn=True

while aiTurn == True:
    allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
    aiGuess=random.choice(allLetters)



    print (aiGuess) 

5 个答案:

答案 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