7 python random shuffle list elements
我试图将第3个列表中的元素洗牌到最后一个位置,所以前两个将始终保持原位,例如
list = ['a?','b','c','d','e']
Run Code Online (Sandbox Code Playgroud)
成
list = ['a?','b','d','e','c']
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这不起作用:
list = ['a?','b','c','d','e']
import random
random.shuffle(list[2:])
print list
Run Code Online (Sandbox Code Playgroud)
谁知道我做错了什么?
对我来说唯一有用的是迄今为止(EDITED):
lists = [['a?','b','c','d','e'],['1?','2','3','4','5','6','7']]
import random
for list in lists:
copy = list[2:]
random.shuffle(copy)
list[2:] = copy
print lists
Run Code Online (Sandbox Code Playgroud)
认为这正是我所需要的.
你做的是这样的:
copy = list[2:]
random.shuffle(copy)
Run Code Online (Sandbox Code Playgroud)
这对原始列表没有太大作用.试试这个:
copy = list[2:]
random.shuffle(copy)
list[2:] = copy # overwrite the original
Run Code Online (Sandbox Code Playgroud)
如果你想在不复制的情况下进行随机播放,你可以尝试编写自己的可变切片类,如下所示(这是一个粗略的实现草图,没有边界检查等):
class MutableSlice(object):
def __init__(self, baselist, begin, end=None):
self._base = baselist
self._begin = begin
self._end = len(baselist) if end is None else end
def __len__(self):
return self._end - self._begin
def __getitem__(self, i):
return self._base[self._begin + i]
def __setitem__(self, i, val):
self._base[i + self._begin] = val
Run Code Online (Sandbox Code Playgroud)
然后将原始列表包装到其中并输入标准shuffle:
>>> mylist = [1,2,3,4,5,6]
>>> slice = MutableSlice(mylist, 2)
>>> import random
>>> random.shuffle(slice)
>>> mylist
[1, 2, 4, 3, 5, 6]
Run Code Online (Sandbox Code Playgroud)
l[2:]
构造一个新列表,并random.shuffle
尝试“就地”更改该列表,这对其l
自身没有影响。
你可以用random.sample
这个:
l[2:] = random.sample(l[2:], len(l)-2)
Run Code Online (Sandbox Code Playgroud)
您可以创建自己的shuffle函数,该函数允许您在可变序列中对切片进行洗牌.它处理切片副本的采样并重新分配回切片.您必须传递slice()
参数而不是更熟悉的[2:]
符号.
from random import sample
def myShuffle(x, *s):
x[slice(*s)] = sample(x[slice(*s)], len(x[slice(*s)]))
Run Code Online (Sandbox Code Playgroud)
用法:
>>> lst = ['a?','b','c','d','e'] #don't use list as a name
>>> myShuffle(lst, 2) #shuffles lst[:2]
>>> lst
['b', 'a?', 'c', 'd', 'e']
>>> myShuffle(lst, 2, None) #shuffles lst[2:]
>>> lst
['b', 'a?', 'd', 'e', 'c']
Run Code Online (Sandbox Code Playgroud)
小智 5
为了将列表的一部分原地打乱,没有副本,我们可以使用Knuth shuffle:
import random
def shuffle_slice(a, start, stop):
i = start
while (i < stop-1):
idx = random.randrange(i, stop)
a[i], a[idx] = a[idx], a[i]
i += 1
Run Code Online (Sandbox Code Playgroud)
它与 random.shuffle 做同样的事情,除了在切片上:
>>> a = [0, 1, 2, 3, 4, 5]
>>> shuffle_slice(a, 0, 3)
>>> a
[2, 0, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)