无法洗牌数组,可能的修复?

2024-09-28 15:26:30 发布

您现在位置: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()

第二个块生成输出:

[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

但是,如果我将数组中的值传递给第一个块中的bn1[]bn[],它将生成所需的输出。但是,不会在第二个块中生成输出。可能是什么原因造成的?你知道吗

我们已经在这里罢工了很长一段时间,任何帮助解决这一点将不胜感激。你知道吗


Tags: theinnoneforifisrangeprint
3条回答

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

关于您的问题-如果代码在第一部分中工作,但在第二部分中不工作,那么问题可能出在数组c中(不深入代码很难说有什么数字,因为名称也没有说明什么),但是我可以看到,在第一部分中,在循环中,您将c的一些值设置为100。在第二步中,您再次通过c(修改了具有许多100个值的c),如果您找到100,您就打破了循环。也许它只是在开始的时候找到100,然后在第一次迭代中打破循环?试着在每个循环中打印一些东西,这样你至少可以知道它是否进入循环以及进入循环的次数,这将帮助你调试它。祝你好运!:)

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

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

您可以尝试在进入bn块之前创建一个c的副本,并使用此副本将bn1块随机化。你知道吗

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

编辑:

比如说,你可以首先使用一个fix,将c的值传递给一个新的var:

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()

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

相关问题 更多 >