前言:这是一项家庭作业,我不是在寻找一个完整的答案,只是在正确的方向上稍微推动一下。我正在编写一个简单的加密程序,它将文件的名称作为输入,打开它并用随机移动的行重写它。我已经这样做了,但我需要以某种方式跟踪转移的行号。我知道我需要写一个新的列表并在它们发生变化时附加索引+ 1,但我无法弄清楚将它放在哪里。
from random import *
seed(123)
text_file = input("Enter a name of a text file to mix: ")
f = open(text_file, 'r')
encrypted = open('encrypted.txt', 'w')
index = open('index.txt', 'w')
lines = []
for line in f:
line = line.strip('\n')
lines.append(line)
ll=len(lines)
new_dict = {}
for line in lines:
new_dict[lines.index(line)+1] = line
for i in range (0,ll*3):
random_one = randint(0,ll-1)
random_two = randint(0,ll-1)
temp1 = lines[random_one]
temp2 = lines[random_two]
lines[random_one] = temp2
lines[random_two] = temp1
for line in lines:
encrypted.write(line + "\n")
encrypted.close()
正如您所看到的,我还创建了一个字典,其中包含.txt文件的内容为1:lineone 2:linetwo。但我不确定使用它是否更容易,或者只是使用列表来跟踪它。
编辑:我已将代码更改为包含:
new_dict[random_one] = temp2
new_dict[random_two] = temp1
new_dict现在打印移位列表的正确顺序,但是在错误的索引处。例如,1:line7 2:line11,但我希望索引与行号匹配,这样我就可以将密钥打印到索引文件中以用于解密。例如:7:line7 11:line11任何提示?
答案 0 :(得分:1)
您实际上不需要保存随机行的顺序。您可以通过使用最初使用的相同随机种子在需要时重新创建它。下面的代码应该给你一些想法。
import random
random.seed(123)
# Create a simple list of strings
a = list('abcdefgh')
print(a)
# Generate a shuffled list of indices
indices = list(range(len(a)))
random.shuffle(indices)
# Shuffle a into b
b = []
for i in indices:
b.append(a[i])
print(b)
# Unshuffle b into c
c = [None] * len(b)
for i, v in zip(indices, b):
c[i] = v
print(c)
<强>输出强>
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
['b', 'e', 'f', 'g', 'd', 'h', 'c', 'a']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
答案 1 :(得分:0)
只需将一个带有凹痕的numpy数组洗牌并将它们随机播放。因此,您可以保存索引以供日后使用。
import numpy as np
indices = np.arange(5)
np.random.shuffle(indices)
print(indices)
没有numpy的版本:
from random import shuffle
indices = list(range(5))
shuffle(indices)