使用Python解码消息:在字母表中向前移动字符串中的字符

时间:2018-03-13 15:29:26

标签: python string for-loop decode

我有一个分配,我必须通过查找偏移代码来解码字符串。偏移代码表示字符串中的字符在字母表中移动的位置数。如果我能找到这个数字,我可以解码字符串。

这是字符串:vyzhesjdpwqncjae

我正在考虑创建一个for循环来遍历字符串并更改每个字符的位置,并查看哪个迭代生成一个单词。但我不太清楚如何做到这一点。

这是我到目前为止的代码:

def decode (newInput):
    for i in range (1,27):
            newInput2 = newInput[i+1]        
    print "Trying to decode:", newInput2

decode(newInput) 

但这不起作用。我想输出打印每次迭代可能的单词组合 - 当字符串中的每个字符移动一个空格时,两个,三个......直到26.这是最好的方法吗?

请记住,我是初学者,我认为我应该坚持使用for循环。我看过一些关于使用字典功能的帖子,但我还没有完全了解它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想提供一些可能对您有所帮助的不同解决方案。你提到你是初学者,所以我会提供一个for循环,但我强烈建议你研究list comprehension - 这是一个有价值和有趣的工具。

请注意,我对所有解决方案使用此shift辅助函数:

def shift(char, dist):
    ascii = ord(char) + dist
    if ascii > 122:
        ascii = ascii - 26

    return chr(ascii)

仅适用于循环

如果您还不熟悉这些解决方案,请查看python的lowerformat函数。

def decode_loops(newInput):
    print('For loops only')
    for i in range(1, 27):
        decoded = ''
        for c in newInput.lower():
            decoded += shift(c, i)
        print('{0}: {1}'.format(i, decoded))

使用列表理解

对于这个,如果您还不熟悉它,请查看python的join函数。

def decode_list_comp(newInput):
    print('For loop and list comp')
    for i in range(1, 27):
        decoded = ''.join([shift(c, i) for c in newInput.lower()])
        print('{0}: {1}'.format(i, decoded))

更多列表理解

这个只是为了表明你可以通过列表理解获得多么复杂 - 我并不是说这是一个很好的解决方案,只是提供更多选项并深入了解你可以用它做什么。就个人而言,如果我不能“阅读”一个列表理解非常接近它听起来如何口头描述它,它可能太复杂了。但我离题了。

def decode_complex_list_comp(newInput):
    print('Complex list comprehension')
    shifted = [shift(c, i) for i in range(1, 27) for c in newInput.lower()]
    decoded_words = [''.join(decoded) for decoded in [shifted[i:i + len(newInput)] for i in range(0, len(shifted), len(newInput))]]
    for i, decoded in enumerate(decoded_words):
        print('{0}: {1}'.format(i + 1, decoded))

希望这些可能的解决方案为您提供一些帮助。但请记住,有许多方法可以做到这一点。这些只是我提出的一些选择。