首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >固定第一个元素,打乱列表/数组的其余部分

固定第一个元素,打乱列表/数组的其余部分
EN

Stack Overflow用户
提问于 2012-07-29 10:56:15
回答 4查看 1.8K关注 0票数 6

是否可以仅对给定列表(或numpy中的数组)的(连续)部分进行混洗?

如果这通常是不可能的,那么在特殊情况下,第一个元素是固定的,而列表/数组的其余部分需要打乱呢?例如,我有一个列表/数组:

代码语言:javascript
复制
to_be_shuffled = [None, 'a', 'b', 'c', 'd', ...]

第一个元素应该始终留在那里,而其余的元素将重复洗牌。

一种可能的方法是首先打乱整个列表,然后检查第一个元素,如果它不是特殊的固定元素(例如None),然后将其位置与特殊元素的位置交换(这将需要查找)。

有没有更好的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-29 12:10:25

numpy数组在切片时不复制数据:

代码语言:javascript
复制
numpy.random.shuffle(a[1:])
票数 5
EN

Stack Overflow用户

发布于 2012-07-29 11:03:25

为什么不干脆

代码语言:javascript
复制
import random
rest = to_be_shuffled[1:]
random.shuffle(rest)
shuffled_lst = [to_be_shuffled[0]] + rest
票数 10
EN

Stack Overflow用户

发布于 2012-07-29 12:09:27

我认为尝试实现一种比您所要求的方法更通用的方法会更有趣,也更有教育意义。在这里,我将索引混洗到原始列表(而不是列表本身),排除锁定的索引,并使用该索引列表从原始列表中挑选元素。这不是一个就地解决方案,而是作为一个生成器实现的,因此您可以懒惰地挑选元素。

如果你能改进它,请随意编辑。

代码语言:javascript
复制
import random

def partial_shuf(input_list, fixed_indices):
    """Given an input_list, yield elements from that list in random order
    except where elements indices are in fixed_indices."""
    fixed_indices = sorted(set(i for i in fixed_indices if i < len(input_list)))
    i = 0
    for fixed in fixed_indices:
        aslice = range(i, fixed)
        i = 1 + fixed
        random.shuffle(aslice)
        for j in aslice:
            yield input_list[j]
        yield input_list[fixed]
    aslice = range(i, len(input_list))
    random.shuffle(aslice)
    for j in aslice:
        yield input_list[j]

print '\n'.join(' '.join((str(i), str(n))) for i, n in enumerate(partial_shuf(range(4, 36), [0, 4, 9, 17, 25, 40])))

assert sorted(partial_shuf(range(4, 36), [0, 4, 9, 17, 25, 40])) == range(4, 36)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11706287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档