python中的字母移位程序
假设我有一个字母表列表:python中的字母移位程序,python,list,shift,slice,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,19来移位这3个字符 与shift'x'0次向右移动一样,shift'y'2次向右移动,shiftz19次向右移动 唯一想到的是类
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,19来移位这3个字符
与shift'x'
0次向右移动一样,shift'y'
2次向右移动,shiftz
19次向右移动
唯一想到的是类似列表的index()
函数
我还看到另一个问题。如果我将'z'
向右移动19次,我将得到一个列表索引超出范围的错误。如果'z'
向右移动19次,我希望它变成's'
,这将是19次移动,在列表中循环并从头开始。与'y'
相同,如果我将其向右移动两次,我希望它变成'a'
等等
关于使用什么有什么建议吗?编辑:我刚刚意识到我可能在回答一个完全不同的问题,因为我的大脑没有正确理解“移位”这个词。因此,我不是在生成新字母,而是在生成一个全新的字母表。请随意指点并大笑
为了处理超出范围的问题,您需要使用模函数%
使数字“环绕”。您可以将其与切片结合使用,以实现轮班
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\u调整空格数到新的位置。我们把字母表在那个位置分开,插入字符,然后把它粘在一起。如果将shift1、shift2、shift3更改为移位位置列表,代码可能会更优雅,但概念证明就在那里。因此,我的方法比声音防御更基本,但当您输入三个字母(如“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)
我可以这样解决吗:如果您不喜欢评论中的此解决方案,请告诉我,我将删除它。(而不是投反对票)
或
#/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(字符、shift_inx):
总计=长度(α)
nxt_inx=α索引(char)+移位inx
如果nxt_inx,我建议使用模算子来解决越界的问题,那该怎么做呢?试着做一些你自己的研究own@robertrocha模运算符返回除法运算的剩余部分;e、 g.19%2=1(19/2=8余数1)
这只是一个从头到尾连接的列表。你要完成的技术任务是:。正如你所看到的,它使用了Revan建议的module操作符,我知道如果有余数,则modules返回余数。这里的目的是什么?让我们以第三个字母为例。如果我在第三个字母中输入y,然后我们再添加19个位置,我们可能会遇到问题,因为我们在列表的末尾。我们取25,加19,得到44。如果我们以44比26获胜,我们将得到18分。虽然我们应该使用模数,而不是减法。这里给出了相同的答案,但是如果你想把位置移动128,我们就会遇到减法的麻烦。余数更好,因此您可以在多个场景中使用它。在second_letter=(second_letter+2)%length
中,当使用python shell计算second_letter=(second_letter+2)%length
时,结果应该是1,如下(25+2)%6给了我一个1如何使用%来包装单词在这种情况下,如果nxt\u inx,您不需要添加
#!/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
#!/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()