2010-03-19 180 views
5

有沒有一種方法追加元素添加到列表中隨機,內置函數Python |如何添加元素添加到列表中隨機

例如:

def random_append(): 
    lst = ['a'] 
    lst.append('b') 
    lst.append('c') 
    lst.append('d') 
    lst.append('e') 
    return print lst 

這會出來把['a', 'b', 'c', 'd', 'e']

但我想它隨機添加元素,並把這樣的東西這樣的: ['b', 'd', 'b', 'e', 'c']

是的有一個函數random.shuffle(),但它洗牌清單一旦我不需要,我只想執行隨機插入。

+1

是否應該有兩個「b」 s在輸出? – 2010-03-19 07:06:29

+1

將整個列表重新排序可能比隨機插入更具可擴展性。 (我不確切知道你需要從這篇文章中得知,說實話。) – 2010-03-19 07:17:46

+1

你可以更具體地講述這個_random inserts_應該如何工作嗎?你知道先驗元素的數量嗎? – 2010-03-19 08:18:36

回答

7

如果您需要在隨機位置執行單一插入,則已經給瑣碎exapmle工作:

from random import randrange, sample 

def random_insert(lst, item): 
    lst.insert(randrange(len(lst)+1), item) 

不過,如果你需要插入k個項目,以長度的名單N,則使用先前給出的函數是O(n * k + k ** 2)複雜度。然而,如果您提前計算目標位置並一次重寫輸入列表,則可以在線性時間O(n + k)中插入多個項目:

def random_insert_seq(lst, seq): 
    insert_locations = sample(xrange(len(lst) + len(seq)), len(seq)) 
    inserts = dict(zip(insert_locations, seq)) 
    input = iter(lst) 
    lst[:] = [inserts[pos] if pos in inserts else next(input) 
     for pos in xrange(len(lst) + len(seq))] 
10

如果有應該是每個項目的

>>> from random import randint 
>>> a=[] 
>>> for x in "abcde": 
... a.insert(randint(0,len(a)),x) 
... 
>>> a 
['b', 'a', 'd', 'c', 'e'] 

只有一個如果允許重複(如輸出指示)

>>> from random import choice 
>>> a=[choice("abcde") for x in range(5)] 
>>> a 
['a', 'b', 'd', 'b', 'a'] 
+5

請注意,這是O(n^2)並填充'a',然後使用'random.shuffle'爲O(n)。 – 2010-03-19 07:17:02

+0

@Mike Graham,大概是OP想要在插入之間做一些事情,因爲他們不想使用shuffle。 – 2010-03-19 07:24:58

+0

@gnibbler,我真的很難從描述中準確理解OP所需要的內容。正如Python公理所指出的那樣,*面對模糊性,拒絕猜測的誘惑*。 – 2010-03-19 07:27:18

6

random.shuffle可能是這個職位的最佳工具。它很簡單,顯而易見,而且名字很可能比你會得到的其他建議更具可讀性。此外,使用它是O(n),但使用insert(O(n)操作)n次是二次的。

0
from random import choice 

n=10 
seq=['a','b','c','d'] 
rstr=[choice(seq) for i in range(n)]