在Python中,如何从一系列数字中选择索引
我正在做一个关于“替换密码”的项目 我拿到了我的“钥匙”,这是一系列数字,比如:在Python中,如何从一系列数字中选择索引,python,encryption,Python,Encryption,我正在做一个关于“替换密码”的项目 我拿到了我的“钥匙”,这是一系列数字,比如: a = {12,31,42,1,23,-12,...} 我的纯文本是“abcdef”,然后ord(纯文本)={97,98,99100101102} 基本上,我想做的是将相应的键添加到我的纯文本中 也就是说,当纯文本是“a”时,它是第0个字母,因此我想在ord“a”中添加第0个键(即12)。当纯文本为“b”时,它是第1个字母,因此我将向该纯文本添加第1个密钥以获取密码文本。等等 如何开始此操作?您可以使用zip
a = {12,31,42,1,23,-12,...}
我的纯文本是“abcdef”,然后ord(纯文本)={97,98,99100101102}
基本上,我想做的是将相应的键添加到我的纯文本中
也就是说,当纯文本是“a”
时,它是第0个字母,因此我想在ord“a”中添加第0个键(即12)。当纯文本为“b”
时,它是第1个字母,因此我将向该纯文本添加第1个密钥以获取密码文本。等等
如何开始此操作?您可以使用zip()
将多个列表的元素配对:
key = (12, 31, 42, 1, 23, -12) # a tuple
inputstring = 'abcdef'
for char, keyval in zip(map(ord, inputstring), key):
# do something with the char ordinal and the key value.
这确实假设您的密钥至少与输入字符串一样长
如果输入键的长度固定,并且希望重复使用,则可以使用重复循环键并将键值与字符串配对,直到字符串中的字符用完:
from itertools import cycle
key = (12, 31, 42, 1, 23, -12) # a tuple
inputstring = 'abcdefghijkl'
for char, keyval in zip(map(ord, inputstring), cycle(key)):
# do something with the char ordinal and the key value.
演示:
这里,键值在与输入字符串的序号配对时重复。正如Martijn指出的,您使用的是不保持顺序的
集合概念({}
),您可能需要使用列表表示法([]
)或元组表示法(()
)。现在,我们可以在字符串上使用enumerate来获取索引和字符串中的对应字符。我们可以在密码表上使用相同的索引来获得相应的数字
a = [12,31,42,1,23,-12]
plainString, lenA = "abcdef", len(a)
for index, char in enumerate(plainString):
print char, ord(char), a[index % lenA]
输出
a 97 12
b 98 31
c 99 42
d 100 1
e 101 23
f 102 -12
您使用的是集合表示法,这意味着没有排序。你想用列表或元组来代替吗?是的!我不知道括号有那么重要。现在我明白了,谢谢你抽出时间。不幸的是,输入字符串可能比键短或长。但是len(钥匙)总是固定在26个好东西上,但是有点太高级了。。。他们真的会给他们的教授留下深刻的印象。是的……这是我有史以来的第一个python项目……你的代码对我来说太高级和复杂了,我似乎无法理解。但无论如何,我感谢您的时间。@user2983167:zip()
合并了两个列表;这里唯一的“高级”东西是itertools.cycle()
调用,真的。@user2983167:map(ord,inputstring)
可以替换为inputstring
,然后在for
循环中使用ord
。如果键比输入短,您可能需要使用a[index%len(a)]
取而代之。@thg435谢谢:)OP可能忘了在问题中提到这一点。嗯……我遇到了一个问题,它说“int”对象不可下标。我想这个错误的意思是“a[索引%lenA]”,我的a和你说的一模一样,是一堆数字。太清楚了,如果我输入a,它会显示26个数字,这是我的钥匙。
a 97 12
b 98 31
c 99 42
d 100 1
e 101 23
f 102 -12