如何多次遍历相同的列表?

Kus*_*nan 2 python arrays loops list

请耐心等待,我已经使用Python只用了2周.

我正在编写一个小项目,其中包括使用用户定义的密钥来加密文本文件(字符串).

例:

String = "Monty"
Key = 1232
Run Code Online (Sandbox Code Playgroud)

我做的第一件事就是把它分成字母,这样它们就变成了:

['m','o','n','t','y'](所有字母都是小写的)

[ '1', '2', '3', '2']

到目前为止对我来说足够容易.我还有一个列表,其中包含0-9的所有英文字母和数字.

现在,加扰部分看起来像这样:

def encrypt0r(textList,keyList,letterList): #Encrypting the string using the key
    encryptedList = []
    encryptedStr = ""

    for character in textList:
        if character in letterList:
            tempIndex = letterList.index(character) + 1 #THE 1 IS A PLACEHOLDER
            encryptedList.append(letterList[tempIndex])

        else:
            encryptedList.append(character) 
    encryptedStr = "".join(encryptedList)
    return encryptedStr
Run Code Online (Sandbox Code Playgroud)

其中3个列表是我的字母列表,4个数字的列表以及所有英文字母和nums的列表.

monty的输出应该是这样的:

nqqvz

因为:

指数m + 1 = n

指数o + 2 = q

索引n + 3 = q

指数t + 2 = v

索引y + 1 = z**注意当keyList已经结束时,它会回到keyList的开头.我怎样才能让它通过列表然后一旦它这样做,再次通过它.

如果有更快的步骤,我很乐意听到它.我一直在脑海中得到[0 :: 4] - [3 :: 4]的这些神像,但我不知道如何实现它.

我的第二个问题与我的第一个问题类似:

上面代码中的占位符只是检查我的程序实际上是否在没有用户定义的键的情况下工作.确实如此,除非你告诉它超过信件清单.该列表以[......,'8','9']结束,因此8 + 1将被加扰为9但我希望9 + 1返回到同一列表的开头并加扰9作为"a".我已经在互联网上搜索了2天,我终于屈服于在这里发帖.

在此先感谢您的帮助.只是要求你们保持术语/行话多一点理解到什么本质上是一个脚本小子(我),如果你有一个解决方案,向我解释它是如何工作的,这样我可以学习,在未来的项目中使用它!

Jes*_*ker 5

第1部分

输入中的每个字母都耦合到键列表中的元素.这意味着这是zip的工作(在python 2中的izip):

for character, key in zip(textList, keyList):
    # processing
Run Code Online (Sandbox Code Playgroud)

问题是,如果keyList短于textList,它将在结束时停止keyList.但是,有一个很好的工具itertools就是itertools.cycle:

for character, key in zip(textList, itertools.cycle(keyList)):
    # processing
Run Code Online (Sandbox Code Playgroud)

第2部分

如果要获取的索引大于letterList的长度,则需要从前面重新开始.这意味着要获取的索引是索引的模数和列表的长度:

encryptedList.append(letterList[tempIndex % len(letterList)])
Run Code Online (Sandbox Code Playgroud)

查找索引具有最差的案例复杂度O(n),这意味着如果所需元素在最后,它将查看列表中的每个元素.为了使这些查找更快,在开始之前构建键的字典并查找其中的索引(O(1)复杂度):

lettermap = {letter: i for i, letter in enumerate(letterList)}
Run Code Online (Sandbox Code Playgroud)

然后在你的循环中:

if character in lettermap:
    tempIndex = lettermap[character]
Run Code Online (Sandbox Code Playgroud)

全部一起

def encrypt0r(text, keys, letters):
    encrypted = []
    lettermap = {letter: i for i, letter in enumerate(letters)}

    for character, key in zip(text, itertools.cycle(keys)):
        if character in lettermap:
            new_index = lettermap[character] + key
            encrypted.append(letters[new_index%len(letters)])
        else:
            encrypted.append(character)
    return "".join(encrypted)
Run Code Online (Sandbox Code Playgroud)