【问题标题】:letter shifting program in pythonpython中的字母移位程序
【发布时间】:2014-07-07 21:58:44
【问题描述】:

假设我有一个字母表:

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

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

我想用上面的移位位置 0,2,19 来移位这 3 个字符

如右移'x' 0 次,右移'y' 2 次,右移z 19 次。

唯一想到的就是列表的index() 函数

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

对使用什么有什么建议?

【问题讨论】:

  • 我建议使用模运算符来解决越界问题
  • 那该怎么做?
  • 试着自己做一点研究
  • @robertrocha 模运算符返回除法运算的余数;例如19 % 2 = 1 (19 / 2 = 8 remainder 1)
  • 只是一个从头到尾相连的列表。你想要完成的技术术语是:en.wikipedia.org/wiki/Circular_shift。如您所见,它使用了 Revan 建议的模块运算符。

标签: python list shift slice


【解决方案1】:

所以我的方法比 TheSoundDefense 更基本,但是当您输入三个字母(如“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)

【讨论】:

  • 我知道如果有余数,模数会返回余数。这里的目的是什么?
  • 我们以第三个字母为例。如果我为第三个字母输入 y,然后我们添加了 19 个位置,我们可能会遇到问题,因为我们在列表的末尾。所以我们取 25 加上 19 得到 44。然后如果我们做 44 - 26 我们得到 18。虽然我们应该使用模数而不是减去。它在这里给了我们相同的答案,但是如果您尝试将位置移动 128,我们将遇到减法问题。其余的要好得多,因此您可以在多种情况下使用它。
  • 在您的second_letter = (second_letter + 2) % length 中,当它应该是 2 时会产生 1
  • 我使用 python shell 计算second_letter = (second_letter + 2) % length 如下 (25 + 2) % 6 给我一个 1
【解决方案2】:

编辑:我刚刚意识到我可能正在回答一个完全不同的问题,因为我的大脑无法正确理解“转变”这个词。因此,我没有生成新字母,而是生成了一个全新的字母表。随意指点和大笑。

为了处理超出范围的问题,您需要使用模数函数% 使数字“环绕”。您可以将其与切片结合使用以实现轮班。

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 更改为班次列表,代码可能会更优雅,但概念证明就在那里。

【讨论】:

  • 如何使用 % 来换行
【解决方案3】:

我可以这样解决吗:如果你不喜欢这个解决方案,请在评论中告诉我,我会删除它。 (而不是投反对票)

#!/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()

【讨论】:

  • 在这种情况下,您不需要添加if nxt_inx &lt;= 25:,因为如果这是真的,% 运算符不会执行任何操作。
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 2016-01-01
  • 2014-05-02
  • 2012-10-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多