python中的字母转换程序

时间:2014-07-07 21:58:44

标签: python list shift slice

我们说我有一个字母表列表:

ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

让我们说换班位置

0,2,19

如果输入是字符串 string =" xyz"

我希望使用0,2,1

的上述移位位置移动这3个字符

在转移'x'向右移动0次,向右移动'y' 2次,向右移动z 19次。

唯一想到的就是列表的index()功能

我也看到了另一个问题。如果我将'z'向右移动19次,我将收到list index out of range错误。如果'z'向右移动19次,我希望它变成's',这将是从列表开始并从头开始的19个班次。与'y'同样的事情,如果我将它向右移动2次,我希望它变为'a'等等。

有关使用内容的任何建议吗?

3 个答案:

答案 0 :(得分:1)

所以我的方式比TheSoundDefense更基本,但是当你输入像#34; xyz"这样的三个字母时,它的效果非常好。 (我猜你可以拿出一张支票来确保他们这样做了)

我使用的主要工具是索引功能,它将匹配列表中的项目,并为我提供该项目的展示位置编号。然后我拿这个号码然后将它添加到你给出的数字中。但后来我将它除以长度并取其余部分。我不在乎它分成多少次,我只想要剩下的因为它告诉我它在字母表中的位置。然后我替换这些字母并打印出来。

ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']


print "Please enter three letters"
x = list(raw_input("> ").upper())


length = len(ALPHABET)


first_letter = ALPHABET.index(x[0])
first_letter = (first_letter + 0) % length

x[0] = ALPHABET[first_letter]

second_letter = ALPHABET.index(x[1])
second_letter = (second_letter + 2) % length

x[1] = ALPHABET[second_letter]

third_letter = ALPHABET.index(x[2])
third_letter = (third_letter + 19) % length

x[2] = ALPHABET[third_letter]





print ''.join(x)

答案 1 :(得分:0)

编辑:我刚刚意识到我可能正在回答一个完全不同的问题,因为我的大脑并不理解“#34; shift"正常。因此,我没有生成新的字母,而是生成一个全新的字母。随意点和笑。

为了处理超出范围的问题,您需要使用模数函数%来使数字"环绕"。你可以将它与切片结合使用以获得转变。

ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

inputstring = "XYZ"

def shift(inputstr, shift1, shift2, shift3):
  new_alphabet = list(ALPHABET)
  shifts = [shift1, shift2, shift3]

  for i in range(0,3):
    inputchar = inputstr[i]
    i1 = new_alphabet.index(inputchar)
    i1_adjust = (i1 + shifts[i]) % len(new_alphabet)

    temp_alphabet = new_alphabet[:i1] + new_alphabet[i1+1:]
    new_alphabet = temp_alphabet[:i1_adjust] + [inputchar] + temp_alphabet[i1_adjust:]
    print new_alphabet

# We call it here.
shift(inputstring,0,2,19)

我们基本上找到了我们角色的索引,并将我们的转移金额添加到它。然后我们从字母表中拉出该字符,并沿i1_adjust个空格移动到新位置。我们在该位置拉开字母表,插入字符,然后将其粘合在一起。如果将shift1, shift2, shift3更改为班次列表列表,则代码可能会更优雅,但概念验证就在那里。

答案 2 :(得分:0)

我可以这样解决:如果您不喜欢评论中的此解决方案,请告诉我,我会将其删除。 (而不是向下投票)

#!/usr/bin/python

alpha = ['A','B','C','D','E','F','G','H','I',\
        'J','K','L','M','N','O','P','Q','R',\
        'S','T','U','V','W','X','Y','Z']

def shift_right(char, shift_inx):

    dic1 = dict(zip(alpha, range(26)))
    dic2 = dict(zip(range(26), alpha))

    total = len(alpha)

    nxt_inx = dic1[char] + shift_inx

    if nxt_inx <= 25:
        return dic2[nxt_inx]
    else:
        return dic2[nxt_inx % total]

def main():
    for x,y in [('X', 0), ('Y', 2), ('Z', 19)]:
        print '%s => %s => %s' % ( x, y, shift_right(x, y))

if __name__ == '__main__':
    main()

输出:

X => 0 => X
Y => 2 => A
Z => 19 => S

OR

#!/usr/bin/python

alpha = ['A','B','C','D','E','F','G','H','I',\
        'J','K','L','M','N','O','P','Q','R',\
        'S','T','U','V','W','X','Y','Z']

def shift_right(char, shift_inx):

    total = len(alpha)

    nxt_inx = alpha.index(char) + shift_inx

    if nxt_inx <= 25:
        return alpha[nxt_inx]
    else:
        return alpha[nxt_inx % total]

def main():
    for x,y in [('X', 0), ('Y', 2), ('Z', 20)]:
        print '%s => %s => %s' % ( x, y, shift_right(x, y))

if __name__ == '__main__':
    main()