在python中列表超出范围?

2024-04-20 08:57:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

是什么导致了错误?如何修复错误?你知道吗


Tags: 代码inpylen错误linerange数字
2条回答

您的代码不应该产生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

不要重新发明轮子。你要找的是^{}-

>>> s=set(range(1,10))
>>> import random
>>> random.sample(s,7)
[7, 5, 6, 8, 9, 3, 4]

尽管处理set实际上看起来像是一个实现细节(可能不适用于超过21个元素的集合),因为random.sample在内部将它接收到的iterable(第一个参数)转换为https://hg.python.org/cpython/file/c6880edaf6f3/Lib/random.py#l330处的列表。最好不要依赖此实现细节,而是手动将集合/序列转换为列表或序列-

>>> s=set(range(1,10))
>>> import random
>>> random.sample(list(s),7)
[6, 8, 4, 2, 5, 9, 7]

根据文件-

random.sample(population, k)

Return a k length list of unique elements chosen from the population sequence. Used for random sampling without replacement.

正如在评论中提到的,您可能并不真正需要在这里设置。你知道吗

相关问题 更多 >