我试图从10个列表中随机选择7个数字,我已经编写了以下代码来帮助我做到这一点:
s=set(range(1,10))
import random
i = []
while len(i)<8:
s.remove(random.choice(list(s)))
i.append(s)
print i
重要的一点是从组中删除号码以防止它被选中两次
然而,当我运行代码时,我得到错误:
Traceback (most recent call last):
File "randomTest.py", line 7, in <module>
s.remove(random.choice(list(s)))
File "/usr/lib/python2.7/random.py", line 273, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
IndexError: list index out of range
导致错误的原因是什么?如何解决?
答案 0 :(得分:4)
不要重新发明轮子。您要找的是random.sample
-
>>> s=set(range(1,10))
>>> import random
>>> random.sample(s,7)
[7, 5, 6, 8, 9, 3, 4]
虽然这对set
起作用实际上似乎是一个实现细节(并且可能不适用于具有超过21个元素的集合),因为random.sample
在内部将迭代(第一个参数)转换为一个列表在https://hg.python.org/cpython/file/c6880edaf6f3/Lib/random.py#l330。最好不要依赖这个实现细节并手动将set / sequence转换为列表或序列 -
>>> s=set(range(1,10))
>>> import random
>>> random.sample(list(s),7)
[6, 8, 4, 2, 5, 9, 7]
来自文档 -
random.sample(population, k)
返回从总体序列中选择的k长度的唯一元素列表。用于无需替换的随机抽样。
正如评论中所提到的,你可能不需要在这里设置一套。
答案 1 :(得分:0)
您的代码不应生成IndexError: list index out of range
,因为在您的示例s
中包含10个元素,并且您选择7。
也许在不同的集合上执行此代码时会引发此异常。
但是,您应该修复一个错误,阻止您查看所寻求的结果:
每次,您将所有s
追加到i
,您想要的只是附加所选的值。
建议:
s=set(range(1,10))
import random
i = []
while len(i)<8:
chosen = random.choice(list(s))
s.remove(chosen)
i.append(chosen)
print i