【问题标题】:Get character position in alphabet获取字母表中的字符位置
【发布时间】:2011-08-21 02:14:28
【问题描述】:

我 90% 确定有一个内置函数可以做到这一点。

我需要找到一个字符在字母表中的位置。所以字符“b”是位置1(从0开始计数)等等。有谁知道这个函数叫什么?

提前致谢!

编辑:我要做的是在 alpha 投注中将所有字符 X 数量的“步”发送回,所以如果我有一个带有“hi”的字符串,如果我发送它,它将是“gh”退一步。可能有更好的方法,有什么建议吗?

【问题讨论】:

    标签: python position character alphabet


    【解决方案1】:

    它被称为index。例如

    >>> import string
    >>> string.lowercase.index('b')
    1
    >>> 
    

    注意:在 Python 3 中,string.lowercase 已重命名为 string.ascii_lowercase

    【讨论】:

    • 谢谢!是否有任何反向功能,所以如果我有一个字符的索引,我可以得到实际的字符?
    • 只是[]它在字符串或列表中。 >>>string.lowercase[2]
    • 它在尝试索引 Y 时失败。它不会出现,因为它不是小写字母。而不是string.lowercase 你可以试试string.ascii_letters
    • 我不得不使用print string.index(string.ascii_lowercase, "c")
    • Python 3:string.ascii_lowercase.index( "R".lower() ) # --> 17
    【解决方案2】:

    没有导入

    def char_position(letter):
        return ord(letter) - 97
    
    def pos_to_char(pos):
        return chr(pos + 97)
    

    【讨论】:

    • 不是+或-96吗?
    【解决方案3】:

    您可以使用 ord() 获取字符的 ASCII 位置,使用 chr() 将 ASCII 位置转换为字符。

    编辑:更新为换行字母表,因此 a-1 映射到 z 和 z+1 映射到 a

    例如:

    my_string  = "zebra"
    difference = -1
    new_string = ''.join((chr(97+(ord(letter)-97+difference) % 26) for letter in my_string))
    

    这将创建一个字符串,其中所有字符在字母表中向后移动一个空格('ydaqz')。它只适用于小写单词。

    【讨论】:

    • 太棒了,我想这是我试图记住的方法。这就是书签!
    • 您可能需要注意,这不会循环 az,对于大写变体也是如此。假设 qwerty 的目标是某种 ROT 算法,则需要借助模运算(或两个)来修复该上限。
    • 这是一个公平的观点。它还会对空格和标点符号做一些奇怪的事情。我认为接受的答案也是如此。
    • 我已更新我的答案以换行字母表。我将假设字符串首先被转换为小写。
    【解决方案4】:
    # define an alphabet
    alfa = "abcdefghijklmnopqrstuvwxyz"
    
    # define reverse lookup dict
    rdict = dict([ (x[1],x[0]) for x in enumerate(alfa) ])
    
    print alfa[1] # should print b
    
    print rdict["b"] # should print 1
    

    rdict 是一个字典,它是通过逐步遍历字母表创建的,一次一个字符。 enumerate 函数返回一个带有列表索引和字符的元组。我们通过使用以下代码创建一个新元组来反转顺序:( x[1], x[0]),然后将元组列表转换为字典。由于字典是哈希表(键、值)数据结构,我们现在可以查找任何字母字符的索引。

    但是,这不是您要解决问题的方法,如果这是课堂作业,如果您提交,您可能会因为抄袭而得 0 分。为了对字符串进行编码,首先创建一个被组织的 SECOND 字母表,以便 alfa2[n] 是 alfa[n] 的编码形式。在您的示例中,第二个字母表将仅移动两个字符,但您也可以随机打乱字符或使用其他模式对它们进行排序。所有这些都将继续适用于其他字母,如希腊语、西里尔语等。

    【讨论】:

      【解决方案5】:

      我才刚刚开始学习 Python,所以我不知道这与其他方法相比效率如何,但它确实有效。此外,无论文本是大写还是小写或是否有任何标点符号等都无关紧要。

      如果要更改所有字母:

      from string import maketrans
      
      textin = "abcdefghijklmnopqrstuvwxyz"
      textout = "cdefghijklmnopqrstuvwxyzab"
      texttrans = maketrans(textin, textout)
      
      text = "qcc, gr umpiq"
      
      print text.translate(texttrans)
      

      也可以改变一些字符:

      from string import maketrans
      
      textin = "81972"
      textout = "Seios"
      texttrans = maketrans(textin, textout)
      
      text = "811, 9t w7rk2"
      
      print text.translate(texttrans)
      

      【讨论】:

        【解决方案6】:

        这是一个可能对某人有用的包罗万象的方法...

        def alphabet(arg, return_lower=True):
        
            """
                Indexing the english alphabet consisting of 26 letters. 
                Note: zero indexed
        
                    example usage:
        
                        alphabet('a')
                        >> 0
        
                        alphabet(25, return_lower=False)
                        >> 'Z'
        
                :param arg: Either type int or type chr specifying the \
                            index of desired letter or ther letter at \
                            the desired index respectivley.
                :param return_lower: If index is passes, returns letter \
                                 with corresponding case. Default is \
                                 set to True (lower case returned). 
                :returns: integer representing index of passed character \
                            or character at passed index.
            """
        
            arg = str(arg)
            assert arg.isdigit() or arg.isalpha()
        
            if arg.isdigit():
                if return_lower:
                    return chr(int(arg) + 97).lower()  
                return chr(int(arg) + 97).upper()
        
            return ord(arg.lower()) - 97
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-15
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2021-05-01
          • 2014-09-10
          • 2012-05-01
          • 1970-01-01
          相关资源
          最近更新 更多