在python中列出超出范围?

时间:2015-09-24 16:48:24

标签: python list

我试图从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

导致错误的原因是什么?如何解决?

2 个答案:

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