2011-09-27 21 views
19

我已經拿了一些東西,它出來NPython:如何製作n個數字的列表並隨機選擇任意數字?

現在我想有一個列表,其中包含0到N的數字。 實例: N = 5 然後,count_list = [1, 2, 3, 4, 5]

我將如何能夠做到這一點?

而且,一旦我已經創建的列表, 我想隨機選擇從該列表中的號碼,並使用該號碼。 之後,我想從列表中剩餘的數字(N-1)中選擇另一個數字,然後再使用它。 這就是它的列表是空的。 有人可以幫我這個嗎? 感謝

+0

你的列表中包含1到N,不是零至N –

+0

有多大你期望電量爲? 10? 10^8?這很重要;所有提供的答案都假設O(N)空間的複雜性......你確定你想要這個嗎?在你的問題中,你明確地說「現在我想要一份清單」,但我想確保你意識到這意味着什麼。 –

+0

我從來沒有想過那麼深。我實際上是在尋找一個N大約20到30的列表。但是既然你已經提到了這個,作爲一個學習練習,你能否幫我做以下幾件事:1.是否是O(N)空間的複雜性? 2,當我的列表大約10^8時會發生什麼 – Sunny

回答

30

您可以通過類似的東西創造的元素的枚舉:

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) 
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

0

創建列表(編輯):

count_list = range(1, N+1) 

選擇隨機元素:

import random 
random.choice(count_list) 
+0

'[x + 1 for x in xrange(N)] == range(1,N + 1)' –

+0

@larsmans第一個產生一個列表,最後 - 迭代器 –

+0

我編輯了我的評論以使用'range'。 –

1

至於第一部分:

>>> N = 5 
>>> count_list = [i+1 for i in xrange(N)] 
>>> count_list 
[1, 2, 3, 4, 5] 
>>> 

至於第二,閱讀: http://docs.python.org/library/random.html

>>> from random import choice 
>>> a = choice(count_list) 
>>> a 
1 
>>> count_list.remove(a) 
>>> count_list 
[2, 3, 4, 5] 

這是一般的想法。

順便說一句,你還可能有興趣在閱讀本:

http://code.activestate.com/recipes/59883-random-selection-of-elements-in-a-list-with-no-rep/

有快速隨機選擇了幾個實現。

1

,如果你想選擇一個隨機元素,您不必指望的東西。只需使用random.choice()並通過您的迭代:

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

如果你真的要算來,使用random.randint(1, count+1)

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

maitain a set並刪除隨機拾取的元素(與choice)直到列表爲空。

s=set(range(1,6)) 
import random 

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

三種運行給三個不同的annswers

>>> 
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([]) 
相關問題