无法改组Array,可能的解决方法?

时间:2018-09-28 07:27:50

标签: 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 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[],它将生成所需的输出。但是,不会在第二个块中产生输出。是什么原因造成的?

在这里停留了很长一段时间后,对于解决该问题的任何帮助将深表感谢。

3 个答案:

答案 0 :(得分:3)

错误是在第一块,您重写了变量c的值而没有建立或使用临时数组。当第二个块使用它时,c的所有值都已设置为100,因此,它立即中断,将bngrid1的值保留为None数组。

编辑:

说,您可以先使用修订,将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()

我没有测试代码,所以我不建议复制粘贴它。

答案 1 :(得分:1)

由于许多变量和数组称为a,b,c等,因此您的代码很难阅读和调试。下次尝试仅发布问题的要点并命名变量,以使其他人容易理解你:)

关于您的问题-如果代码在第一部分中起作用而在第二部分中不起作用,则问题可能出在数组c中(很难说出什么数字而没有深入到代码中,因为再次说出名字但我可以看到,在第一部分中,您将循环中的c值设置为100。在第二部分中,您再次遍历了c(使用许多100个值修改了c),如果找到100,则会破坏环。也许它只是在开始时找到100,并在第一次迭代中打破了循环?尝试在每个循环中打印一些内容,以便至少知道它是否进入循环以及循环多少次,它将帮助您调试它。祝好运! :)

答案 2 :(得分:0)

问题似乎是您正在使用c数组中所有将bn数组随机化的块中的值,然后将值设置为100。

因此,在bn1块运行时,所有对c.index(min(c))的调用都返回零。

您可以在进入bn块之前尝试创建c的副本,并使用该副本随机化bn1块。