【问题标题】:How to convert "ABCD…" to "CDEF…" in a Pythonic way?如何以 Pythonic 方式将“ABCD…”转换为“CDEF…”?
【发布时间】:2017-04-14 12:55:29
【问题描述】:

例如,我有一个lst = "ABCXYZ",我希望输出是"CDEZAB"

到目前为止我想出的最好的方法是:

"".join(chr((ord(x)-ord('A')+2)%26+ord('A')) for x in lst)

这很尴尬。使用像 {'A': 'C', 'B': 'D', ……, 'X': 'Z', 'Y': 'A', 'Z': 'B'} 这样的字典似乎更符合 Python 风格,但更尴尬。

有什么想法吗?

【问题讨论】:

  • 虽然可以很容易地创建字典:conv = dict(zip(alphabet, alphabet[2:] + alphabet[:2])) 然后转换就像''.join(map(conv.get, string)) 一样简单

标签: python string algorithm python-3.x ascii


【解决方案1】:

您可以简单地构建该字典:

>>> import string
>>> dict(zip(string.uppercase, string.uppercase[2:]+string.uppercase[:2]))
{'A': 'C', 'C': 'E', 'B': 'D', 'E': 'G', 'D': 'F', 'G': 'I', 'F': 'H', 'I': 'K', 'H': 'J', 'K': 'M', 'J': 'L', 'M': 'O', 'L': 'N', 'O': 'Q', 'N': 'P', 'Q': 'S', 'P': 'R', 'S': 'U', 'R': 'T', 'U': 'W', 'T': 'V', 'W': 'Y', 'V': 'X', 'Y': 'A', 'X': 'Z', 'Z': 'B'}

然后使用它:

>>> m = dict(zip(string.uppercase, string.uppercase[2:]+string.uppercase[:2]))
>>> ''.join(map(m.get, "ABCXYZ"))
'CDEZAB'

【讨论】:

    【解决方案2】:

    你的建议对我来说很有意义;使用一些内置插件可以更优雅一些。

    import string
    
    s = "ABCXYZ"
    
    d = dict(enumerate(string.ascii_uppercase))
    ''.join([d[(string.ascii_uppercase.index(c) + 2)%26] for c in s])
    

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 2016-05-29
      • 2014-05-22
      • 2012-09-20
      • 2018-09-30
      • 2010-11-27
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多