我想使用一个函数转换所有偶数字母,使用另一个函数转换所有奇数字母。因此,每个字母代表0-25与a-z相对应,因此a,c,e,g,i,k,m,o,q,s,u,w,y是偶数字符。
但是,只有我的偶数字母正确转换。
def encrypt(plain):
charCount = 0
answer=[]
for ch in plain:
if charCount%2==0:
answer.append(pycipher.Affine(7,6).encipher(ch))
else:
answer.append(pycipher.Affine(3,0).encipher(ch))
return ''.join(answer)
答案 0 :(得分:4)
您永远不会在循环中更改charCount
- 因此它从0
开始并保持在0
,这意味着每个ch
将被视为"甚至"
根据您的更新,您实际上想要检查角色是否奇怪或甚至是基于它"索引"在英文字母表中。在这里有一些字符与数字的映射是有帮助的。你可以自己构建它:
alphabet = 'abcde...' # string.ascii_lowercase?
mapping = {k: i for i, k in enumerate(alphabet)}
OR 我们可以使用内置ord
注意ord('a')
产生奇怪的结果,ord('b')
是偶数等等。
def encrypt(plain):
answer=[]
for ch in plain:
if ord(ch) % 2 == 1: # 'a', 'c', 'e', ...
answer.append(pycipher.Affine(7,6).encipher(ch))
else: # 'b', 'd', 'f', ...
answer.append(pycipher.Affine(3,0).encipher(ch))
return ''.join(answer)
答案 1 :(得分:1)
您的基本方法是每次看到它时重新加密一封信。只加密26个可能的字符,可能需要对它们进行预加密,然后只对纯文本中的每个字符执行查找。这样做时,你不需要计算每个角色的位置,因为你知道你在整个时间内在偶数和奇数之间交替。
import string
def encrypt(plain):
# True == 1, False == 0
fs = [pycipher.Affine(3,0).encipher,
pycipher.Affine(7,6).encipher]
is_even = True # assuming "a" is even; otherwise, just set this to False
d = dict()
for ch in string.ascii_lowercase:
f = fs[is_even]
d[ch] = f(ch)
is_even = not is_even
return ''.join([d[ch] for ch in plain])
您也可以使用itertools.cycle
来简化替换。
def encrypt(plain):
# again, assuming a is even. If not, reverse this list
fs = itertools.cycle([pycipher.Affine(3,0).encipher,
pycipher.Affine(7,6).encipher])
d = dict((ch, f(ch)) for f, ch in zip(fs, string.ascii_lowercase))
return ''.join([d[ch] for ch in plain])
答案 2 :(得分:0)
由于你的偶数字的概念是基于字母表中字符的位置,你可以使用ord()
,如下所示:
if ord(ch)%2==0:
请注意,ord('a')
和ord('A')
都是奇数,因此会a
进入else
部分。如果你想要相反,那么只是否定条件:
if ord(ch)%2!=0:
答案 3 :(得分:0)
这是我的两分钱。 @mgilson提出的建议当然也有效,但不是你指定的方式(在评论中)。在编写代码之后,尝试在头脑中调试代码。完成for循环并执行1-2次迭代,以查看变量是否采用了您希望的值。 charCount
永远不会重新分配值。它始终为0.并且,是charCount += 1
会使其更改,但不以您希望的方式...
def encrypt(plain):
alphabet = 'abcdefghijklmnopqrwstuvwxyz'
answer = ''
for letter in plain:
try:
if alphabet.index(letter.lower()) % 2 == 0:
answer += pycipher.Affine(7, 6).encipher(letter)
else:
answer += pycipher.Affine(3, 0).encipher(letter)
except:
answer += letter
return answer
my_text = 'Your question was not very clear OP'
encripted_text = encrypt(my_text)
此外,我不会使用ord(ch)
,因为ord('a') = 97
而非0
因此是奇数而非偶数。