如何追加偶数和奇数字符python

时间:2016-09-13 15:02:46

标签: 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).encipher(ch))
        else:
            answer.append(pycipher.Affine(3,0).encipher(ch))
    return ''.join(answer)

4 个答案:

答案 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因此是奇数而非偶数。