2010-03-19 3 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(), но она перетасовывает список a t, который я не требую, я просто хочу выполнять только случайные вставки.

+1

Есть должно быть два 'b'» s на выходе? –

+1

Перетасовка всего списка, вероятно, более масштабируема, чем случайные вставки. (Я точно не знаю, что вам нужно от этого поста, если честно.) –

+1

Можете ли вы уточнить, как эта _random inserts_ должна работать? Знаете ли вы количество элементов априори? –

ответ

7

Если вам необходимо выполнить единственную вставку в случайном положении, то уже дано тривиальное exapmle работы:

from random import randrange, sample 

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

Однако, если вам нужно вставить K элементов в список длины п, то, используя ранее заданная функция - это сложность O (n * k + k ** 2). Однако вставляя несколько элементов может быть сделано в линейном времени О (п + к), если вычислить целевые позиции впереди времени и переписать список ввода на одном дыхании:

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

+0

@ Майк Грэм, предположительно, OP хочет что-то сделать со списком между вставками, так как они не хотят использовать тасование. –

+0

@gnibbler, мне действительно трудно понять, что именно хочет от описания, как оно стоит. Поскольку аксиома Питона идет, * Перед лицом двусмысленности отказывайтесь от соблазна угадать. *. –

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)] 
Смежные вопросы