Python | 如何随机地将元素追加到列表中

Swi*_*tch 7 python

有没有办法将元素随机附加到列表中,内置函数

例如:

def random_append():
     lst = ['a']
     lst.append('b')
     lst.append('c')
     lst.append('d')
     lst.append('e')
     return print lst
Run Code Online (Sandbox Code Playgroud)

这将出局 ['a', 'b', 'c', 'd', 'e']

但是我希望它随机添加元素并输出如下内容: ['b', 'd', 'b', 'e', 'c']

是的,有一个函数random.shuffle(),但它一次洗了一个我不需要的列表,我只想执行随机插入.

Joh*_*ooy 10

如果应该只是每个项目中的一个

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

如果您允许重复(如输出所示)

>>> from random import choice
>>> a=[choice("abcde") for x in range(5)]
>>> a
['a', 'b', 'd', 'b', 'a']
Run Code Online (Sandbox Code Playgroud)

  • 注意,这是O(n ^ 2)并填充`a`然后使用`random.shuffle`是O(n). (5认同)

Ant*_*sma 8

如果你需要在随机位置执行单个插入,那么已经给出的简单的exapmle工作:

from random import randrange, sample

def random_insert(lst, item):
    lst.insert(randrange(len(lst)+1), item)
Run Code Online (Sandbox Code Playgroud)

但是,如果需要将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))]
Run Code Online (Sandbox Code Playgroud)


Mik*_*ham 6

random.shuffle可能是这项工作的最佳工具.它简单明了,名字很好 - 它可能比你得到的其他建议更具可读性.另外,使用它是O(n),但是使用insert(O(n)运算)n次是二次的.