将排列应用于具有不同长度的列表多次

时间:2014-04-30 12:48:10

标签: python

我对编程很新,所以如果这里有明显的答案,请原谅我。

我基本上想要对字符串应用置换。如果字符串的长度与排列的长度不同,我想添加一个'Z',使长度成为排列长度的倍数。问题是如果说排列长度为4且字符串长度为8,我如何将排列应用于字符串的后半部分?

这是我到目前为止所拥有的

def encr(k, m):
    if len(m)%len(k)!=0:
        for i in range((int(len(m)%len(k)))):
            m+=str('Z')
        return apply(m, k)

并且继承了前一个函数中调用的apply函数

def apply(L,P):
    A = list(range(len(L)))
    for i in range(len(L)):  A[i] = L[P[i]]
    return A

我想将排列应用于字符串,以便进行简单的加密。它只会切换字符串中字母的索引。但是如果字符串比排列更长,我如何让排列多次应用于同一个字符串。例如:Permutation = [2,3,0,1,4]并且字符串将是“hello”它会使它成为“llheo”但是如果字符串是“hello_world”,我该如何让排列再次重新开始在第四个指数之后?如果我感到困惑,我道歉,我只是不知道如何说出来。

1 个答案:

答案 0 :(得分:1)

好的,我希望我能正确理解你。我想你要问的是,如果你给出一个字符列表和一个索引列表来重新排列这些字符你怎么能:

一个。将字符添加到字符列表的末尾,使长度为索引列表长度的倍数

B中。使索引列表重复长于索引列表的字符列表(即[4,0,1,3,2]将在10个字符长的列表中使用两次)

如果情况确实如此,那么这是我的回应......

首先,如果您只是将单词中的随机字符添加为烫发的倍数,那么重复烫发,您的单词会出现问题,总是会在烫发长度的组中加扰。 I.E.如果你的烫发长度是5个字符,你的文字是'aaaaabbbbbcccccddddd',无论排列顺序如何,结果总是'aaaaabbbbbcccccddddd'。但是因为我不确切地知道你使用它的是什么,所以我认为这就是你想要的......

这将在字符列表的末尾添加“Z”,直到长度是排列顺序长度的倍数。我认为这就是你想要的。此外,我已经注释掉了一行代替添加随机小写字符的行,而不是添加'Z',以防您发现有用。

import random

def enc(oldword, perm):
    while len(oldword)%len(perm)!=0:
        oldword.append('Z')
##        oldword.append(chr(random.randrange(97,123)))
    newword=[]
    while len(oldword)>0:
        for i in perm:
            newword.append(oldword[i])
        for _ in range(len(perm)):
            oldword.pop(0)
    return newword

如果你试图使用一个密钥(比如你的排列列表)来搜索一个单词或句子,你可以用它来解密这个消息,我建议你做一个修改。您可以将输入设为NUMBER,而不是提供烫发列表,然后使用该数字:

重复计算字符串中的字符,直到达到该数字,然后从字符串中删除该字符并从该点开始重复该过程。例如,如果单词是'hello'并且数字是7,你将计算单词hello中的5个字符,然后返回h表示数字6,e表示7.你将删除'e'表示剩下的到目前为止字符串'hllo'和你的新字符串将是'e'。然后从你离开的地方开始再次数到7。重复一遍,直到你的字符串中没有其他字符。

更详细的例子......

对于使用数字65的文本'hello_world'

def enc(oldword, siferkey):
    #be sure that the oldword is a list of characters i.e. ['a','b','c']
    oldword=[oldword[i] for i in range(len(oldword))]
    newword=[]
    dex=0
    while len(oldword)>0:
        dex+=siferkey-1
        while dex not in range(len(oldword)):
            dex-=len(oldword)
        newword.append(oldword.pop(dex))
    return newword

print enc(['h','e','l','l','o','_','w','o','r','l','d'],65)

会返回['r','l','w','e','_','l','l','o','o','h','d'] 然后解读它你会用它:

def dec(wrd, sifer):
    dex=0
    newword=['' for _ in range(len(wrd))]
    dex+=sifer-1
    while dex not in range(len(newword)):
        dex-=len(newword)
    newword[dex]=wrd.pop(0)
    counter=0
    while len(wrd)>0:
        counter+=sifer
        while counter>0:
            dex+=1
            if dex not in range(len(newword)):
                dex=0
            if newword[dex]=='':
                counter-=1
        newword[dex]=wrd.pop(0)
    return newword

请原谅我,如果我试图去这里的方向完全错了。