首页 > 解决方案 > 如何将列表恢复为原始形式

问题描述

我将如何撤消我在 alist 上所做的洗牌并将其恢复到原来的顺序:

[1, 2, 3 , 4]

import random

alist = [1, 2, 3, 4]

random.shuffle(alist)  # alist is randomly shuffled

标签: python-3.x

解决方案


我刚刚从A good way to shuffle 中得到了这个答案,然后取消了一个 python 列表问题的接受答案,并对它做了一些小的改动。它工作完美,请参考@trincot 和@canton7 答案以获取更多信息,他们受过良好教育。

import random


def getperm(l):
    seed = sum(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):  # [1, 2, 3, 4]
    perm = getperm(l)  # [3, 2, 1, 0]
    l[:] = [l[j] for j in perm]  # [4, 3, 2, 1]


def unshuffle(l):  # [4, 3, 2, 1]
    perm = getperm(l)  # [3, 2, 1, 0]
    res = [None] * len(l)  # [None, None, None, None]
    for i, j in enumerate(perm):
        res[j] = l[i]
    l[:] = res  # [1, 2, 3, 4]


alist = [1, 2, 3, 4]
print(alist)  # [1, 2, 3, 4]

shuffle(alist)
print(alist)  # shuffled, [4, 3, 2, 1]

unshuffle(alist)
print(alist)   # the original, [1, 2, 3, 4]

推荐阅读