有没有办法将元素随机附加到列表中,内置函数
例如:
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(),但它一次洗牌我不需要,我只想进行随机插入。
答案 0 :(得分: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']
答案 1 :(得分:8)
如果您需要在随机位置执行单个插入,那么已经给出的琐碎的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))]
答案 2 :(得分:6)
random.shuffle
可能是这项工作的最佳工具。它简单明了,名字很好 - 它可能比你得到的其他建议更具可读性。另外,使用它是O(n),但使用insert
(O(n)运算)n次是二次的。
答案 3 :(得分:0)
from random import choice
n=10
seq=['a','b','c','d']
rstr=[choice(seq) for i in range(n)]