如何多次循环浏览相同的列表?

时间:2018-02-11 16:55:25

标签: python arrays list loops

请耐心等待,我已经使用Python只用了两周。

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

示例:

String = "Monty"
Key = 1232

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

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

[' 1'&#39 2'&#39 3'&#39 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

其中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天,我终于屈服于在这里发帖。

提前感谢您的帮助。只是要求你们让行话/术语更容易理解为什么本质上是一个脚本小子(我),如果你有一个解决方案,请向我解释它是如何工作的,以便我可以在未来的项目中学习和使用它!

1 个答案:

答案 0 :(得分:5)

第1部分

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

for character, key in zip(textList, keyList):
    # processing

问题是,如果keyListtextList短,则会在keyList结束时停止。但是,itertools中有一个很好的工具:itertools.cycle

for character, key in zip(textList, itertools.cycle(keyList)):
    # processing

第2部分

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

encryptedList.append(letterList[tempIndex % len(letterList)])

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

lettermap = {letter: i for i, letter in enumerate(letterList)}

然后在你的循环中:

if character in lettermap:
    tempIndex = lettermap[character]

一起

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)