gpt4 book ai didi

Python3 - 索引超出范围(维吉尼亚密码)

转载 作者:行者123 更新时间:2023-12-01 04:09:09 25 4
gpt4 key购买 nike

我正在开始编写代码来执行维吉尼亚密码加密。首先,我想制作 key 。 key 需要一遍又一遍地重复,直到它与要加密的消息的长度匹配,因此我创建了一个可以为我执行此操作的函数:

def makekey(key, message):
finalkey = []
print(message) # to see if the key fits under the message correctly
key = list(key)
while len(finalkey) < len(message): # while the key is shorter than the message
for i in range(0, len(key)): # iterate through characters in the key
finalkey.append(key[i]) # append the characters in the processed key list
if len(finalkey) > len(message): # if the final key is still bigger than the message
difference = len(finalkey) - len(message) # finds the difference between the two
del key[-difference] # removes the difference
return ''.join(finalkey) # joins the final key into a string

print(makekey("LOVE", "Python")) # calling the function

输出应如下所示:

Python
LOVELO

但是程序只是给了我一个索引超出范围的错误,我不知道发生了什么!

错误消息:

Traceback (most recent call last):
File "test.py", line 14, in <module>
print(makekey("LOVE", "Python")) # calling the function
File "test.py", line 8, in makekey
finalkey.append(key[i]) # append the characters in the processed key list
IndexError: list index out of range

最佳答案

您的代码不起作用的原因:

del key[-difference]

应该是:

del finalkey[-difference]

尝试访问 finalkey.append(key[i]) 行中的 key[3] 时会出现 IndexError(其中i=3) 删除该元素后。

只是为了好玩,这里有一个替代实现。

def make_key(key, message):
""" Returns a string that repeats the `key` string until it's
the length of the `message` string
"""
if len(key) < len(message): # only lengthen key if it's too short
# In python, "abc" * 3 == "abcabcabc"
# so what would we need to multiply our `key` by to get
# it to be as long as `message`, or longer?
# A guaranteed answer is: floor(len(message) / len(key)) + 1
multiplier = (len(message) // len(key)) + 1
key = key * multiplier
# now we have a `key` that is at least as long as `message`
# so return a slice of the key where the end of the slice == len(message)
return key[:len(message)]

print(makekey("LOVE", "Python"))

打印:LOVELO

编辑 - 神秘的一行解决方案

如果你想让每个读你代码的人都对你翻白眼,你可以试试这个:

from itertools import islice, cycle
key = "LOVE"
message = "Python"
finalkey = ''.join(islice(cycle(key), len(message)))

cycle 函数采用一个iterable 对象(在我们的例子中为key 字符串),并在无限循环中重复它。因此,如果我们创建cycle("LOVE"),它将生成"L"、"O"、"V"、"E"、"L"、"O"、"V ”、“E”、“L”... 永远。

islice 函数允许我们获取迭代器对象的“切片”。在 Python 中,“切片”是表达式 new = old[0:3][0:3] 部分的术语 - 我们“切片”出一个子- 原件集。由于我们不希望字符串无限长(这不会很有用),因此我们只想获取我们创建的cycle的一部分:

islice(cycle(key), len(消息)

这需要我们的迭代器 - cycle(key) - 并从索引 0 开始到索引 len(message) 结束。这将返回另一个迭代器——这一次,它不是无限的。迭代器的内容现在为:“L”、“O”、“V”、“E”、“L”、“O”

现在,我们只需要把 islice 拼接成一个完整的字符串:

''.join(islice...) == "LOVELO"

只是为了给你的工具箱里多一个工具!

关于Python3 - 索引超出范围(维吉尼亚密码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35185307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com