Python-仅随机播放列表中的某些元素 [英] Python - shuffle only some elements of a list
问题描述
我正在尝试仅将列表中的元素从第3个移到最后一个位置,以便第一个第2个始终保持在原位 例如
I'm trying to shuffle only elements of a list on 3rd till last position so the 1st two will always stay in place e.g.
list = ['a?','b','c','d','e']
进入
list = ['a?','b','d','e','c']
出于某种原因,它不起作用:
and for some reason this doesn't work:
list = ['a?','b','c','d','e']
import random
random.shuffle(list[2:])
print list
有人知道我在做什么错吗?
Any know what am I doing wrong??
到目前为止,唯一对我有用的是此内容(已编辑):
The only thing that works for me is so far this (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
认为这正是我所需要的.
Think this is exactly what I needed.
推荐答案
如果您想在不复制的情况下进行改组,则可以尝试编写自己的可变切片类,如下所示(这是一个粗略的实现草图,没有边界检查等) :
If you want to shuffle without copying, you may try to write your own mutable slice class, like follows (that's a rough implementation sketch, no boundary checks etc):
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
然后将原始列表包装到其中,并馈入标准随机播放:
Then wrap the original list into it and feed to the standard shuffle:
>>> mylist = [1,2,3,4,5,6]
>>> slice = MutableSlice(mylist, 2)
>>> import random
>>> random.shuffle(slice)
>>> mylist
[1, 2, 4, 3, 5, 6]
这篇关于Python-仅随机播放列表中的某些元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!