在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