Python | 如何随机向列表中添加元素

10 投票
4 回答
19063 浏览
提问于 2025-04-15 20:36

有没有办法可以随机地往一个列表里添加元素,使用内置的函数呢?

举个例子:

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(),它是一次性把整个列表打乱,但我不需要这个,我只想要随机插入元素而已。

4 个回答

6

random.shuffle 可能是最合适的工具。它简单明了,名字也很贴切——用起来可能比你得到的其他建议更容易理解。而且,使用它的时间复杂度是 O(n),但如果你用 insert(这也是一个 O(n) 的操作)重复 n 次,那就变成了 O(n²),也就是效率会变得很低。

11

如果每种物品应该只有一个

>>> 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']
12

如果你需要在一个随机位置插入一个元素,那么之前给出的简单例子就可以用了:

from random import randrange

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

不过,如果你需要在一个长度为 n 的列表中插入 k 个元素,那么使用之前提到的函数的复杂度是 O(n*k + k**2)。这听起来有点复杂,但简单来说,就是随着列表和要插入的元素数量的增加,处理的时间会变得更长。不过,如果你提前计算好要插入的位置,并一次性重写输入列表,那么插入多个元素的时间可以缩短到线性时间 O(n+k),这样效率会更高:

from random import sample
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))]

撰写回答