我们说我有一个字母表列表:
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'
等等。
有关使用内容的任何建议吗?
答案 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)
为了处理超出范围的问题,您需要使用模数函数%
来使数字"环绕"。你可以将它与切片结合使用以获得转变。
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()