Python-仅随机播放列表中的某些元素 [英] Python - shuffle only some elements of a list

查看:89
本文介绍了Python-仅随机播放列表中的某些元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试仅将列表中的元素从第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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆