如何在同一个列表中循环多次?

2024-05-16 06:38:04 发布

您现在位置:Python中文网/ 问答频道 /正文

请容忍我,我用Python才两个星期。你知道吗

我正在写一个小项目,其中包括使用一个用户定义的键来扰乱文本文件(字符串)。你知道吗

示例:

String = "Monty"
Key = 1232

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

['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

其中3个列表分别是“我的字母列表”、“4位数字列表”和“所有英文字母列表”以及NUM。你知道吗

monty的输出应该是这样的:

NQVZ公司

因为:

指数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”。我在网上搜索了两天,终于屈服于在这里发帖。你知道吗

事先谢谢你的帮助。只是要求你们保持行话/行话多一点理解什么本质上是一个脚本小子(我),如果你有一个解决方案,向我解释它是如何工作的,以便我可以学习和使用它在未来的项目!你知道吗


Tags: the项目用户列表定义字母数字指数
1条回答
网友
1楼 · 发布于 2024-05-16 06:38:04

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

相关问题 更多 >