используя ключ для перестановки строки - PullRequest
4 голосов
/ 27 февраля 2010

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

def rearrange(key, data):
    pass

def restore(key, rearranged_data):
    pass

Эффективность не важна. Есть идеи?

Edit:

Ответы [ 3 ]

4 голосов
/ 27 февраля 2010

Используйте random.shuffle с ключом в качестве начального числа:

import random

def rearrange(key, data):
    random.seed(key)
    d = list(data)
    random.shuffle(d)
    return ''.join(d)

def restore(key, rearranged_data):
    l = len(rearranged_data)
    random.seed(key)
    d = range(l)
    random.shuffle(d)
    s = [None] * l
    for i in range(l):
        s[d[i]] = rearranged_data[i]
    return ''.join(s)


x = rearrange(42, 'Hello, world!')
print x
print restore(42, x)

Выход:

oelwrd!, llHo
Hello, world!
3 голосов
/ 27 февраля 2010

вы можете заново изобрести колесо, но почему бы не попробовать сначала библиотеку шифрования , если это возможно.

1 голос
/ 27 февраля 2010

Реализация, которая отменяет перетасовку с помощью sort():

import random

def reorder_list(ls, key):
   random.seed(key)
   random.shuffle(ls)

def reorder(s, key):
   data = list(s)
   reorder_list(data, key)
   return ''.join(data)

def restore(s, key):
   indexes = range(len(s))
   reorder_list(indexes, key)
   restored = sorted(zip(indexes, list(s)))
   return ''.join(c for _, c in restored)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...