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