这是一个很好的方法来洗牌然后解压python lis

2024-06-26 04:04:29 发布

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

假设我有一个元组列表

l=[(1,2),(3,4),(5,6),(7,8),(9,10)]

我想在一个特定的规则之后洗牌,这样在我洗牌列表之后,我可以使用相同的方法将其反洗牌。在

一个例子是,我将整个列表向右移动1个位置,然后我可以将经过无序处理的列表向左移动一个位置,这样就可以得到原始列表。在

但这看起来有点简单,所以我想知道他们是否有更具创造性的方法

编辑:我的想法是,如果我把经过洗牌的列表发送给某人,他可以在不知道原始列表的情况下,只知道用于洗牌的方法,就可以对其进行取消缓冲


Tags: 方法编辑列表规则情况例子发送给元组
2条回答

我想你可以应用任何你喜欢的洗牌,只要你能种子你的随机来源。在

取一个数字从0到n的列表,然后洗牌。使用此列表的顺序来无序排列元组列表,例如,如果洗牌后列表的第一个元素是5,则无序排列的元组列表中的第一个元素是l[5]。然后,您可以反其道而行之:无序排列的元组列表中的第一个元素是非缓冲元组列表中的第五个元素。在

如果你可以用你的随机数列表中的0重新洗牌。在

编辑:trincot的答案实现了这个想法,但是使用了有效的示例代码。在

您可以选择某种算法来确定一个种子,该种子可以从列表本身派生而不依赖于其顺序。在

对于示例数据结构,种子可以是所有值的总和。然后用这个种子生成一个从0到n-1的随机(但具有确定性)排列。然后,该排列可作为洗牌和取消缓冲函数的基础:

import random

def getperm(l):
    seed = sum(sum(a) for a in l)
    random.seed(seed)
    perm = list(range(len(l)))
    random.shuffle(perm)
    random.seed() # optional, in order to not impact other code based on random
    return perm

def shuffle(l):
    perm = getperm(l)
    l[:] = [l[j] for j in perm]

def unshuffle(l):
    perm = getperm(l)
    res = [None] * len(l)
    for i, j in enumerate(perm):
        res[j] = l[i]
    l[:] = res

示例调用:

^{pr2}$

相关问题 更多 >