Python-只洗牌lis的一些元素

2024-04-24 13:40:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想把第三个位置的列表中的元素拖到最后一个位置,这样前两个将始终保持不变 e、 g

list = ['a?','b','c','d','e']

进入

list = ['a?','b','d','e','c']

出于某种原因,这不起作用:

list = ['a?','b','c','d','e']
import random
random.shuffle(list[2:])    
print list

你知道我做错了什么吗??

到目前为止,唯一对我有效的是(编辑):

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

我想这正是我需要的。


Tags: inimport元素编辑列表forrandomlists
3条回答

你要做的是:

copy = list[2:]
random.shuffle(copy)    

这对最初的名单没有多大影响。试试这个:

copy = list[2:]
random.shuffle(copy)
list[2:] = copy # overwrite the original

您可以创建自己的shuffle函数,该函数允许您在可变序列中对切片进行shuffle。它处理切片副本的采样和重新分配回切片。必须传递slice()参数,而不是更熟悉的[2:]符号。

from random import sample
def myShuffle(x, *s):
    x[slice(*s)] = sample(x[slice(*s)], len(x[slice(*s)]))

用法:

>>> 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']

如果您想在不复制的情况下乱序,可以尝试编写自己的可变切片类,如下所示(这是一个粗略的实现草图,没有边界检查等):

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

然后将原始列表包装到其中并馈送到标准洗牌:

>>> mylist = [1,2,3,4,5,6]
>>> slice = MutableSlice(mylist, 2)
>>> import random
>>> random.shuffle(slice)
>>> mylist
[1, 2, 4, 3, 5, 6]

相关问题 更多 >