如何在python中附加偶数和奇数字符

如何在python中附加偶数和奇数字符,python,Python,我想用一个函数转换所有偶数字母,用另一个函数转换所有奇数。每个字母代表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).enciph

我想用一个函数转换所有偶数字母,用另一个函数转换所有奇数。每个字母代表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)

循环中从不更改
charCount
,因此它从
0
开始,一直保持在
0
这意味着每个
ch
都将被视为“偶数”

根据您的更新,您实际上希望根据英文字母表中的“索引”检查字符是奇数还是偶数。这里有一些字符到数字的映射是很有帮助的。你可以自己建造它:

alphabet = 'abcde...'  # string.ascii_lowercase?
mapping = {k: i for i, k in enumerate(alphabet)}
或者我们可以使用内置的
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)

循环中从不更改
charCount
,因此它从
0
开始,一直保持在
0
这意味着每个
ch
都将被视为“偶数”

根据您的更新,您实际上希望根据英文字母表中的“索引”检查字符是奇数还是偶数。这里有一些字符到数字的映射是很有帮助的。你可以自己建造它:

alphabet = 'abcde...'  # string.ascii_lowercase?
mapping = {k: i for i, k in enumerate(alphabet)}
或者我们可以使用内置的
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)
由于偶数字母的概念是基于字符在字母表中的位置,因此可以使用如下:

 if ord(ch)%2==0:
请注意,
ord('a')
ord('a')
都是奇数,这将使
a
进入
else
部分。如果您想要相反的结果,则只需否定条件:

 if ord(ch)%2!=0:
由于偶数字母的概念是基于字符在字母表中的位置,因此可以使用如下:

 if ord(ch)%2==0:
请注意,
ord('a')
ord('a')
都是奇数,这将使
a
进入
else
部分。如果您想要相反的结果,则只需否定条件:

 if ord(ch)%2!=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
,因此是奇数而不是偶数。

这是我的两分钱。@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
,因此是奇数而不是偶数。

您的基本方法是每次看到一封信时重新加密它。由于只有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])

您的基本方法是在每次看到信件时对其重新加密。由于只有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])

我尝试通过执行以下操作来增加charCount:charCount=charCount+1,但它仍然给了我错误的结果这将根据正在转换的字符串中的字母索引而不是OP想要的字母表来转换字符串。@Ev.Kounis--OP在我回答时没有指定。我尝试通过执行以下操作来增加charCount:charCount=charCount+1,但是它仍然给了我错误的结果这会根据正在转换的字符串中的字母索引而不是OP想要的字母表来转换字符串。@Ev.Kounis--OP在我回答时没有指定。偶数字母是什么意思?当单词被视为python字符串时,与偶数索引相对应的单词中的字母?每个字母代表0-25个与a-z相对应的字母,因此a、c、e、g、i、k、m、o、q、s、u、w、y是偶数字符请编辑问题并将您在评论中提供的信息合并到其中。偶数字母是什么意思?当单词被视为python字符串时,与偶数索引相对应的单词中的字母?每个字母代表0-25个与a-z相对应的字母,因此a、c、e、g、i、k、m、o、q、s、u、w、y是偶数字符请编辑问题并将您在评论中提供的信息合并到其中。但是“abc…”中的“a”具有偶数索引号(0).但是'abc…'中的'a'有一个偶数索引号(0)。偶数或奇数指字母在字母表中的位置,而不是在要加密的字符串中。。所以“aaaaaaaa”中的所有字母都是“偶数”,这取决于加密算法的计算量有多大,这个答案的质量在非常好和出色之间变化。for循环中的
d[p]
应该是a
d[c]