Хороший способ перемешать и затем перемешать список питонов - PullRequest
0 голосов
/ 16 февраля 2019

Допустим, у меня есть список кортежей

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

Я хочу перетасовать значения после определенного правила, чтобы после перетасовки списка я мог отменить его, используя тот же метод.

Одним из примеров может быть то, что я сдвигаю весь список вправо на 1 позицию, а затем я могу сместить перетасованный список на одну позицию влево, чтобы я мог получить исходный список.

Ноэто кажется довольно простым, поэтому мне было интересно, есть ли у них более творческие методы для этого

Редактировать: Идея состояла бы в том, что, если я отправлю кому-нибудь перетасованный список, он сможет отменить его, не зная оригинального списка, толькозная метод, используемый для перемешивания

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Вы ищете deque?

from collections import deque

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

d.rotate(1)
deque([(9, 10), (1, 2), (3, 4), (5, 6), (7, 8)])

d.rotate(-1)
deque([(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)])
0 голосов
/ 16 февраля 2019

Вы можете выбрать некоторый алгоритм для определения начального числа, которое может быть получено из самого списка и не зависит от его порядка.

Для примера структуры данных начальное число может быть, например, суммой всех значений.Затем с этим начальным числом вы сгенерируете случайную (но детерминированную) перестановку чисел от 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

Пример вызова:

l=[(1,2),(3,4),(5,6),(7,8),(9,10)]   
print(l)    
shuffle(l)
print(l) # shuffled
unshuffle(l)
print(l)  # the original
0 голосов
/ 16 февраля 2019

Полагаю, вы могли бы применить любой случайный случай, если только вы можете заполнить свой случайный источник.

Возьмите список с номерами от 0 до n и перемешайте его.Используйте порядок этого списка, чтобы перетасовать ваш список кортежей, например, если первый элемент вашего списка после перетасовки - 5, то первый элемент в вашем перетасованном списке кортежей - l[5].Затем вы можете сделать обратное: первый элемент в вашем перетасованном списке кортежей - это 5-й элемент в вашем списке несмешанных кортежей.

Если вы заполняете свой случайный источник, вы можете воссоздать свой список перемешанных чисел простозапустить тот же случайный порядок в том же списке от 0 до n.Затем вы можете использовать это, чтобы восстановить свой список перемешанных кортежей, как и раньше.

Редактировать : ответ Trincot реализует эту идею, но с рабочим примером кода.

...