如何从集合中选择随机元素?我特别感兴趣的是从Java中的HashSet或LinkedHashSet中选择一个随机元素.也欢迎其他语言的解决方案.
我知道python集的元素没有排序.调用pop方法返回一个任意元素; 我很好.
我想知道的是,当集合具有相同的历史记录时,pop是否总是会返回相同的元素.当然,在python的一个版本中,我不介意python的不同版本/实现是否有自己的功能.特别是,我问的是python 2.7.在这种情况下,这不仅仅是api的实现问题.
我在游戏的程序性地牢生成器中使用了很多集合,我希望结果对于给定的种子是确定性的.
在3.6之前我会简单地使用set.pop().现在,集合是有序的,并且pop总是从头开始删除.
您认为最pythonic的方式是什么?
我不确定我的感受set.remove(random.sample(set, 1)[0]).
我正在寻找一个内置的Python数据结构,它可以add包含一个新元素,remove一个现有元素,并选择一个随机元素,所有这些都比O(n)时间好.
我希望set可以做到这一点,但AFAIK,从Python集中选择随机元素的唯一方法是random.choice(list(my_set)),花费O(n)时间.
我更倾向于使用内置于Python的解决方案,因为我需要高效且易于部署.不幸的是,Python似乎没有内置的树数据类型.
我正在random用这个例子在 Python 3 上学习函数,得到一个错误作为帖子标题。'dict_keys' object is not subscriptable. 我不确定我哪里做错了dictionary。
import random
outcomes = {
'heads':0,
'tails':0
}
sides = outcomes.keys()
for i in range(100):
outcomes[random.choice(sides)] += 1
print("Heads:", outcomes['heads'])
print("Tails:", outcomes['tails'])
Run Code Online (Sandbox Code Playgroud)
下面是错误输出
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-f58aad35f1b0> in <module>
8
9 for i in range(100):
---> 10 outcomes[random.choice(sides)] += 1
11
12 print('Heads:', outcomes['heads'])
C:\ProgramData\Anaconda3\lib\random.py in choice(self, seq)
260 except ValueError:
261 raise IndexError('Cannot choose from an empty sequence') from None …Run Code Online (Sandbox Code Playgroud)