【问题标题】:Taking characters out of list and turning them into other characters将字符从列表中取出并将它们变成其他字符
【发布时间】:2016-10-30 15:58:20
【问题描述】:

我已经制作了一种秘密语言,我可以将完整的单词放入输入中并按照列表中的字母得到输出。假设我输入“AB”,我希望输出为“QW”。

while True:
    print("type sentence you want translated")
    Befor=input()
    After=list(Befor)

    if Befor=="A":
        print("Q")
    elif Befor=="B":
        print("W")
    elif Befor=="C":
        print("E")
    elif Befor=="D":
        print("R")
    else:
        print("--")

    print(After)

pass

【问题讨论】:

  • 您能解释一下您在实施过程中遇到的问题吗?发生了什么不符合您的预期?
  • 我一次只能用一个字母来做这个,我想让它做完整的单词
  • 看来您刚刚开始学习 Python。尝试使用for letter in Befor:,您可以在其中放置if-elif-else 块。

标签: python string python-3.x


【解决方案1】:

您正在输入两个字母,但您的测试条件每个只包含一个字符。您应该使用 for 迭代输入字符串,并一次测试一个字符串中的每个字符:

before = input()

for i in before:
    if i=="A":
        print("Q")
    elif i=="B":
        print("W")
    elif i=="C":
        print("E")
    elif i=="D":
        print("R")
    else:
        print("--")

您还可以通过使用 映射 而不是 if/elif 来改进您的代码,因为这将帮助您更轻松地适应新的翻译:

before = input()
mapping = {'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R'}

after = ''.join(mapping.get(x, '--') for x in before)
print(after)

请注意,当映射不包含字符时,如何使用字典的 get 方法返回默认的 '--'

【讨论】:

    【解决方案2】:

    您也可以自动填充,

    before = input()
    
    mapping = {chr(x):(chr(x+6) if x + 6 < 91 else chr(x+6-26)) for x in range(65,91)} 
    
    print(mapping)
    
    after = ''.join(mapping.get(x, '--') for x in before)
    print(after)
    
    SUBHAM
    {'A': 'G', 'B': 'H', 'C': 'I', 'D': 'J', 'E': 'K', 'F': 'L', 'G': 'M', 'H': 'N', 'I': 'O', 'J': 'P', 'K': 'Q', 'L': 'R', 'M': 'S', 'N': 'T', 'O': 'U', 'P': 'V', 'Q': 'W', 'R': 'X', 'S': 'Y', 'T': 'Z', 'U': 'A', 'V': 'B', 'W': 'C', 'X': 'D', 'Y': 'E', 'Z': 'F'}
    YAHNGS
    
    [Program finished]
    

    可能会绕行?这有点像停止者密码?可以重用python中已有的很多东西

    def genCipher(offset):
      from collections import deque
      from string import ascii_uppercase
      c = deque(ascii_uppercase)
      c.rotate(-offset)
      return dict(zip(ascii_uppercase, c))
    
    print(genCipher(6))
    
     {A': 'G', 'B': 'H', 'C': 'I', 'D': 'J', 'E': 'K', 'F': 'L', 'G': 'M', 'H': 'N', 'I': 'O', 'J': 'P', 'K': 'Q', 'L': 'R', 'M': 'S', 'N': 'T', 'O': 'U', 'P': 'V', 'Q': 'W', 'R': 'X', 'S': 'Y', 'T': 'Z', 'U': 'A', 'V': 'B', 'W': 'C', 'X': 'D', 'Y': 'E', 'Z': 'F'} 
    

    【讨论】:

      【解决方案3】:

      您正在重新发明轮子,请使用str.translate。要使用str.translate,首先需要创建一个字典,用于将原始字符映射到新字符。可以使用maketrans 制作此转换表。

      >>> mapping = {'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R'}
      >>> str.maketrans(mapping)
      {65: 'Q', 66: 'W', 67: 'E', 68: 'R'}
      

      现在我们已经准备好了表格,我们只需要将它传递给translate

      >>> table = str.maketrans(mapping)
      >>> "AB".translate(table)
      'QW'
      

      现在我们得到了想要的结果。

      【讨论】:

      • 不是最佳解决方案
      • 我希望那不是因为我在你的回答中处理了一个标志。 :)
      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2018-07-30
      • 2019-05-28
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多