【问题标题】:Is there a method to convert a letter into it's index in a tuple in python?有没有一种方法可以将字母转换为python元组中的索引?
【发布时间】:2020-07-01 16:22:40
【问题描述】:

我的意思是,如果我有: 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"] 并收到“a”的输入,我会从元组的索引中取回 1 的索引,或者 z 以取回 26 的索引。我想知道是否有更简单的方法而不是使用字典。 所以就像我从字母元组中接收到一个项目的输入,它将返回索引。 我问这个是因为我正在创建一个简单的凯撒密码编码/解码器,我只想将 3 添加到索引中,然后该索引将用于创建另一个变量,该变量的整个字母表按索引 3 移动,因此“a”变为“d”和“z”变成了“c”。

【问题讨论】:

  • 请注意,如果您不关心 alphabet 元组,而实际上只是想从字母到数字再返回,则有 ordchr

标签: python indexing tuples


【解决方案1】:

与 C 相同的技巧,假设是英文字母:

idx = ord(x) - ord('a') + 1

(加一,因为您为值“a”请求了“1”)

【讨论】:

    【解决方案2】:

    string.ascii_lowercase 已经按顺序排列了所有字母(作为字符串),因此您可以定义如下函数:

    from string import ascii_lowercase
    
    def letter_position(letter: str) -> int:
        if len(letter) > 1:
            return 0
        return ascii_lowercase.find(letter.lower()) + 1
    

    此函数适用于大写和小写字母,如果传递给它的不是单个字母,则返回0(所以'a'返回1'B'返回2,但@ 987654328@ 和 '!' 都返回 0):

    >>> letter_position('a')
    1
    >>> letter_position('B')
    2
    >>> letter_position('ab')
    0
    >>> letter_position('!')
    0
    

    【讨论】:

      【解决方案3】:

      字典是去这里的正确方法。您应该使用字典之外的函数处理任何“偏移量”。

      # secret coder
      alphabet = list('abcdefghijklmnopqrstuvwxyz ')
      
      # make dictionaries for encode / decode
      key = {ltr:idx for idx, ltr in enumerate(alphabet)}
      reverse_key = {idx:ltr for idx, ltr in enumerate(alphabet)}
      
      # do the "tricky stuff" with a function
      
      def encode(word, offset):
          result = []
          for letter in word:
              result.append(key[letter] + offset)
          return result
      
      def decode(code, offset):
          result = []
          for num in code:
              result.append(reverse_key[num - offset])
          return ''.join(result)
      
      # take it for a test drive...
      
      secret_key = 5  # select anything you want, just use same for encode/decode
      
      secret = encode('dog food', secret_key)
      print(secret)
      
      # get back the original w/ the secret key
      retrieved = decode(secret, secret_key)
      print(retrieved)
      

      输出:

      [8, 19, 11, 31, 10, 19, 19, 8]
      dog food
      

      【讨论】:

        【解决方案4】:

        这是你的凯撒密码:

        from string import ascii_lowercase
        
        
        def encode(s, offset):
            offset %= 26
            result = []
            for ch in s:
                substitute = ascii_lowercase.index(ch) + offset
                result.append(ascii_lowercase[substitute % 26])
            return ''.join(result)
        
        
        def decode(s, offset):
            offset %= 26
            result = []
            for ch in s:
                original = ascii_lowercase.index(ch) - offset
                result.append(ascii_lowercase[original])
            return ''.join(result)
        
        
        if __name__ == '__main__':
            s = 'abcdefwxyza'
            for i in range(-100, 100):
                assert(decode(encode(s, i), i) == s)
        

        【讨论】:

          【解决方案5】:

          要对字符串进行编码/解码,translate / make_trans 可用于创建密码。

          from string import ascii_lowercase as lc, ascii_uppercase as uc
          
          
          def encode(s, offset):
              return s.translate(
                  str.maketrans(lc+uc,
                                lc[offset:]+lc[:offset]+uc[offset:]+uc[:offset]))
          
          def decode(s, offset):
              return s.translate(
                  str.maketrans(lc+uc,
                                lc[26-offset:]+lc[:26-offset]+uc[26-offset:]+uc[:26-offset]))
          
          s = 'Hello World!'
          
          encoded = encode(s, 3)
          print(encoded)
          decoded = decode(encoded, 3)
          print(decoded)
          

          打印

          Khoor Zruog!
          Hello World!
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-11
            • 1970-01-01
            • 2022-08-22
            • 2021-03-13
            • 2021-12-13
            • 2021-11-13
            • 1970-01-01
            • 2022-09-24
            相关资源
            最近更新 更多