如何在Python中生成一个包含n个数字的列表并随机选择其中任意一个数字?

33

我已经对某个东西进行了计数,并且结果是N。

现在我想要一个列表,其中包含1到N的数字。

例:

N = 5

那么,count_list = [1,2,3,4,5]

另外,一旦我创建了这个列表,我想随机从列表中选择一个数字并使用该数字。

之后,我想从列表中剩下的数字(N-1)中选择另一个数字,然后也使用它。

如果列表为空,则继续进行此操作。


您的列表包含从1到N,而不是从零到N。 - Fred Foo
你期望N有多大?10?10^8?这很重要;所有提供的答案都假定O(N)空间复杂度...你确定你想要这个吗?在你的问题中,你非常明确地说“现在我想要一个列表”,但我想确保你意识到这意味着什么。 - Asim Ihsan
我从未深入思考过这个问题。实际上,我正在寻找一个N的最大约为20到30的列表。但既然你提到了这个问题,作为我的学习练习,您能帮我回答以下问题吗?1. O(N)空间复杂度是什么?2. 当我的列表约为10^8时会发生什么? - Sunny
2
你可以查看https://dev59.com/-HRB5IYBdhLWcg3w3K0J了解Big O。至于N=10^8...,首先将程序运行为N=10^5,然后是N=10^6等等...你会看到差异而无需测量。 - Gandi
2
@Sunny:甘迪的链接很好,但有点长而且技术性强。简短回答:大O表示“如果我有N个元素,我的过程会变得更加昂贵吗?”人们通常关注“时间复杂度”,即需要多长时间,但几乎总是忽略了“空间复杂度”,即需要多少内存。相信我-在Python中,具有1亿个整数的数组占用了大量RAM! :) 我只是在shell中运行“range(10 ** 8)”,它占用了1.6GB! - Asim Ihsan
8个回答

41

您可以通过类似以下方式创建元素的枚举:

mylist = list(xrange(10))

然后你可以使用 random.choice 函数来选择你的项目:

import random
...
random.choice(mylist)

正如Asim Ihsan所正确指出的那样,我的答案没有解决OP的完整问题。要从列表中删除值,只需调用list.remove()即可:

import random
...
value = random.choice(mylist)
mylist.remove(value)

正如takataka指出的那样,在Python 3中,xrange内置函数已被重命名为range


5
xrange 在 Python3 中无法使用。简单使用 range 替代即可。 - takasoft

7
你可以尝试这段代码。
import random
N = 5
count_list = range(1,N+1)
random.shuffle(count_list)

while count_list:
    value = count_list.pop()
    # do whatever you want with 'value'

1
δΫΩγî®while count_list:εΑ±ηΕ≥δΜΞφΒ΄η·ïcount_listφ‰·εêΠδΗΚγ©Κεà½ηΓ®... - eumiro

2

1

如果您想随机选择一个元素,就无需计数。只需使用random.choice()并传入您的可迭代对象即可:

import random
items = ['foo', 'bar', 'baz']
print random.choice(items)

如果你真的需要计数,可以使用random.randint(1, count+1)

1
保持一个set并随机选择一个元素(使用choice)删除,直到列表为空:
s = set(range(1, 6))
import random

while len(s) > 0:
  s.remove(random.choice(list(s)))
  print(s)

三次运行得到三个不同的答案:

>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])

1

您可以使用:

import random
random.choice(range(n))

或者:

random.choice(range(1,n+1))

如果你想从1n而不是从0开始。


1
之后,我想从列表中剩余的数字(N-1)中选择另一个数字,然后也使用它。
那么,您可能并不真正想创建一个从1到N的数字列表,只是为了挑选一个数字(为什么不直接在该范围内要求一个随机数,而不是明确地创建它以供选择?),而是要对这样的列表进行洗牌。幸运的是,random模块也可以为此提供帮助:只需使用random.shuffle即可。
当然,如果您有一个巨大的数字列表,只想抽取几个,那么使用random.choice逐个抽取并删除它们当然是有意义的。
但是...为什么要从与某些项目计数相对应的范围中选择数字?您将使用该数字选择其中一个项目吗?不要这样做;这样做会使事情变得过于复杂。如果要选择其中一个项目,则直接使用random.choice即可。

0
创建列表(已编辑):
count_list = range(1, N+1)

选择随机元素:

import random
random.choice(count_list)

[x+1 for x in xrange(N)] == range(1, N+1) - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接