Python 无法洗牌数组,可能修复吗?
正在尝试实现加密算法,以下是到目前为止的源代码:Python 无法洗牌数组,可能修复吗?,python,Python,正在尝试实现加密算法,以下是到目前为止的源代码: import random import itertools msg = input(" Enter the KEY : ") ascivalue = sum(ord(ch) for ch in msg) a = [] i=0 b = [None] * 16 c = [None] * 26 d = [None] * 26 print("ASCII VALUE=", ascivalue) print('') # print('The Shuffe
import random
import itertools
msg = input(" Enter the KEY : ")
ascivalue = sum(ord(ch) for ch in msg)
a = []
i=0
b = [None] * 16
c = [None] * 26
d = [None] * 26
print("ASCII VALUE=", ascivalue)
print('')
# print('The Shuffeled values are : \n')
for x in range(ascivalue):
a.append(x)
random.Random(4).shuffle(a)
#a.append(random.randint(1, ascivalue))
# print('\t\t',a)
for x in range(16):
b[x] = a[x]
print( "\n16 randomly generated numbers are : \n ")
print('\t\t',b)
for i in range(16):
d = b[i] % 26
# m = d
if (c[d] == None):
c[d] = d
else:
while (c[d] != None):
d = d + 1
if d == 26:
d = 0
c[d] = d
print("\n After normalization numbers are :\n")
random.Random(4).shuffle(c)
# print('\t\t',c)
print('')
while None in c:
c.remove(None)
print('\t\t',c)
e = [None] * 16
f = [None] * 16
g = [None] * 16
i = 0
for i in range(16):
e[i] = c[i] + 64
if(e[i] == 64):
f[i] = chr(90) # corresponding character of each values
else:
f[i] = chr(e[i])
i = i + 1
print("\nRandomly generated English letters – playfair cipher grid is : ")
print('')
for row in range(4):
for col in range(4):
print(f.pop(), end=' ')
print()
# print('\nascii value of characters in the keygrid is: ')
# for i in range(16):
# g[i] = ord(f[i])
# i = i + 1
# print('')
# print('\t\t',g)
print('')
lst = list(itertools.product([1, 0], repeat=4))
print('The 4*4 Binary grid is : ')
print('')
for row in range(4):
for col in range(4):
print(lst.pop(), end=' ')
print()
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
for row in range(4):
for col in range(4):
print(bngrid.pop(), end=' ')
print()
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
minpos1 = []
bngrid1 = [None] * 16
for x in range(16):
minpos1 = c.index(min(c))
if c[minpos1] == 100:
break
bngrid1[minpos1] = bn1[x]
c[minpos1] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid1)
print()
# for row in range(4):
# for col in range(4):
# print(dnagrid.pop(), end=' ')
# print()
问题是,我能够在以下方面对价值观进行调整:
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
但是,不包括:
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
需要注意的事实是,相同的代码用于两个目的:
这里是第一个街区:
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
这是第二个街区:
bn1 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 'GC', 'CA', 'CT', 'CG', 'CC']
minpos1 = []
bngrid1 = [None] * 16
for x in range(16):
minpos1 = c.index(min(c))
if c[minpos1] == 100:
break
bngrid1[minpos1] = bn1[x]
c[minpos1] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid1)
print()
第二个块生成输出:
[无,无,无,无,无,无,无,无,无,无,无,无,无,无,无,无,无,无]
但是,如果我在第一个块中将数组bn1[]
中的值传递给bn[]
,它将生成所需的输出。但是,不会在第二个块中生成输出。这可能是什么原因造成的
在这里被敲了很长一段时间,任何解决这个问题的帮助都将不胜感激。故障在第一个块,您重写了变量c的值,而没有创建或使用临时数组。当第二个块使用它时,c的所有值都已设置为100,因此,它立即中断,将bngrid1的值保留为一个无数组 编辑: 比如说,你可以首先使用一个补丁,将c的值传递给一个新的变量:
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
c_temp = [ item for item in c] #don't use c_temp=c, that's wrong
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c_temp.index(min(c_temp))
if c_temp[minpos] == 100:
break
bngrid[minpos] = bn[x]
c_temp[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
第二个也一样
或者您可以为其创建一个函数:
def func(c):
bn = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
minpos = []
bngrid = [None] * 16
for x in range(16):
minpos = c.index(min(c))
if c[minpos] == 100:
break
bngrid[minpos] = bn[x]
c[minpos] = 100
print('\n shuffeled bngrid using the keygrid is :\n\t\t')
print(bngrid)
print()
我没有测试代码,因此我不建议复制粘贴它。您的代码很难阅读和调试,因为有许多变量和数组称为a、b、c等。下次尝试只发布问题的要点并命名变量,以便其他人容易理解:)
关于您的问题-如果代码在第一部分中有效,但在第二部分中无效,那么问题可能出在数组c中(如果不深入代码,很难说出有哪些数字,因为名称也没有说明任何内容),但我可以看到,在第一部分中,在循环中,您将一些c值设置为100。在第二个循环中,您再次通过c(修改了c,有许多100个值),如果您找到100,您就打破了循环。也许它只是在开始时找到100个,然后在第一次迭代中打破循环?尝试在每个循环中打印一些内容,这样您至少可以知道它是否进入循环以及进入循环的次数,这将帮助您调试它。祝你好运!:) 问题似乎在于,您正在块中使用c数组中的所有值,该块将bn数组随机化,然后将值设置为100 因此,当bn1块运行时,对c.index(min(c))的所有调用都返回零
在进入bn块之前,您可以尝试创建一个c的副本,并使用此副本将bn1块随机化。请将代码减少到最低限度以再现问题。您可以为此创建一个函数,该函数将接受变量c并在不影响原始数组的情况下在本地使用它。或者,您可以使用另一行将c的副本传递给另一个var。