【问题标题】:Convert alphabet letters to number in Python在 Python 中将字母转换为数字
【发布时间】:2011-05-30 13:30:16
【问题描述】:

以下如何完成?

characters = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''t''u''v''w''x''y''z']
numbers = ['1''2''3''4''5''6''7''8''9''10''11''12''13''14''15''16''17''18''19''20''21''22''23''24']
text = raw_input(' Write text: ')

我尝试了很多方法来解决它,但无法解决问题。我想做exc。如果我输入“你好”,输出将是像字母一样排列的数字。示例 a = 1

【问题讨论】:

  • 到目前为止你有什么,它怎么不工作?
  • 这个有效:pastebin.com/SYwgcpg8 但是当我增加数字时它不起作用,我不知道其他方法:S
  • 请注意,您在列表中遗漏了一个字母和两个数字... :P 您应该始终尽量避免手动构建这样的长列表。有更好的方法可以做到这一点。 :)(例如:导入字符串;字母 = string.lowercase)
  • 这些列表没有逗号。
  • 您真正想要输出什么,请举例说明?因为'ab' == '12' == 'l'。在您的 pastebin 代码中,maketrans 采用一串字母到字母的映射,例如“abcd”、“1234”。这不支持 2 位数字。

标签: python


【解决方案1】:

这样的事情怎么样:

print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]

ord
list comprehension
ASCII character codes

编辑
既然你要我解释,我会……尽管 [?] 已经在 cmets 中很好地解释了它。

让我们从一行开始。

input = raw_input('Write Text: ')
input = input.lower()
output = []
for character in input:
    number = ord(character) - 96
    output.append(number)
print output

这做同样的事情,但更具可读性。在尝试理解我的第一个答案之前,请确保您能理解这里发生的事情。这里的一切都是非常标准、简单的 Python。需要注意的一件事是ord 函数。 ord 代表序数,几乎每一种高级语言都会有这种类型的函数可用。它为您提供了到任何字符的数字表示的映射。 ord 的反函数称为 chr。

chr(ord('x')) == 'x' # for any character, not just x.

如果您自己测试,a 的序数是 97(我在上面发布的第三个链接将显示完整的 ASCII 字符集。)每个小写字母都在 97-122 范围内(26 个字符)。所以,如果你只需从任何小写字母的序数中减去 96,假设你取 'a' == 1,你将得到它在字母表中的位置。所以,'b' 的序数 == 98,'c' == 99 等. 当你减去 96 时,'b' == 2,'c' == 3 等等。

我发布的初始解决方案的其余部分只是一些您可以学习的 Python 技巧,称为列表理解。但是,我不会像专注于学习用任何语言解决问题那样专注于这个问题,而 ord 是你的朋友。我希望这会有所帮助。

【讨论】:

  • 哇,这工作完美,谢谢...如果打扰您,我很抱歉,但如果您能向我解释代码,我将不胜感激:)
  • @altin: ord() 返回字符串的整数序号。所以ord('A') 将返回 97,即A 的 ASCII 值。 [] 是一个列表理解。这意味着,获取您通过raw_input输入的字符的ord值,使用.lower()将其转换为小写并从中减去96。这样做是为了获得您想要的输出。
  • 我不知道这是否应该是一个问题,但任何标点符号都会给出负值。我很想在您的列表理解中添加“if char.isalpha()”干杯。
  • 不要在代码中使用幻数。为了清楚起见,请使用ord('a') - 1 而不是96
【解决方案2】:

您可以使用 chr() 和 ord() 在字母和 int 数字之间进行转换。

这是一个简单的例子。

>>> chr(97)
'a'
>>> ord('a')
97

【讨论】:

  • 纯代码的答案很少有帮助。请解释这是如何回答问题的。谢谢。
  • 我不同意,我通常向下滚动,直到找到一个简洁的代码答案来复制和粘贴,同时避免阅读冗长的解释
  • 对于 Pandas 我必须这样做:df['number_col'] = df['number_col'].astype(int).apply(lambda x: chr(ord('`')+x))
【解决方案3】:

不要太基本,但是这样:

>>> char1 = ['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']

与此非常不同:

>>> char2 = ['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']

第一个,没有逗号和你的问题,是一个包含 26 个元素字符串的元素列表。第二个是一个包含 26 个元素的列表,每个元素的长度为单个字符。

如果您打印每个:

>>> print char1, len(char1), len(char1[0])
['abcdefghijklmnopqrstuvwxyz'] 1 26
>>> print char2, len(char2), len(char2[0])
['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'] 26 1

很明显,将char1 的单个字符转换为iterable 需要额外的步骤。

如果您有字符“a”到“z”和/或“A”到“Z”的sequence,则可以使用list comprehension轻松返回字符的编号:

>>> [ord(x)%32 for x in char2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

对于你拥有的数据结构类型,你需要先访问字符串:

>>> [ord(x)%32 for x in char1[0]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

因此,如果您的代码清单与您的问题相同,那可能是您的问题。

一个合理的选择是:[ord(x.lower())-96 for x in char1[0]]

你可以看到你的characters=['a''b''c'...],没有逗号,就像在['abc...']这样的列表中输入字符串中的所有字符一样。

所以现在试试:

 >>> import string
 >>> [ord(x.lower())-96 for x in string.letters]
 [1,2,...26, 1,2,3...26]      # my ellipses 
 >>> char3=[string.letters]   # one string as element[0]
 >>> [ord(x)%32 for x in char3[0]]
 >>> [ord(x)%32 for x in [string.letters][0]]

【讨论】:

    【解决方案4】:

    如果您要经常使用这种转换,请考虑计算一次并将结果放入字典中:

    >>> import string
    >>> di=dict(zip(string.letters,[ord(c)%32 for c in string.letters]))
    >>> di['c'] 
    3
    

    优点是字典查找速度非常快,而不是在每次调用时遍历列表。

    >>> for c in sorted(di.keys()):
    >>>    print "{0}:{1}  ".format(c, di[c])
    # what you would expect....
    

    【讨论】:

      【解决方案5】:

      这是我用于此目的的功能。适用于大写和小写。

      def convert_char(old):
          if len(old) != 1:
              return 0
          new = ord(old)
          if 65 <= new <= 90:
              # Upper case letter
              return new - 64
          elif 97 <= new <= 122:
              # Lower case letter
              return new - 96
          # Unrecognized character
          return 0
      

      【讨论】:

      • 由于您将每个人(大写和小写)都转换为数字,我宁愿将您的“旧”转换为小写,而不是制作 2 个单独的大小写(if 和 elif)。 +1 :)
      • 有没有 raw_input('text: ') ?
      • 是的,@Morlock 是对的。这段代码很老了,我想我什至都没有写完(只是从源代码复制和粘贴)。 @sberry2A 实际上可能有最好的解决方案。
      【解决方案6】:

      类似于 this

      [str(ord(c)&31) for c in text]
      

      【讨论】:

        【解决方案7】:

        您可以将字母表映射到一个列表,并按以下方式返回每个字母表的索引:

        import string
        
        alphabet=string.ascii_lowercase
        #alphabet='abcdefghijklmnopqrstuvwxyz'
        
        #Get the character index , ex: e  
        print(chars.find('e'))
        #This will return 4
        

        【讨论】:

        • 你肯定是指alphabet.find,而不是chars.find。也不应该是chars.find('e') + 1吗?顺便提一下。
        • 虽然这段代码可能会解决问题,包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。你可能想看看How to Answer
        【解决方案8】:
        >>> [str(ord(string.lower(c)) - ord('a') + 1) for c in string.letters]
        ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17',
        '18', '19', '20', '21', '22', '23', '24', '25', '26', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24',
         '25', '26']
        

        【讨论】:

          【解决方案9】:
          def letter_to_int(letter):
              alphabet = list('abcdefghijklmnopqrstuvwxyz')
              return alphabet.index(letter) + 1
          

          这里,如果列表中包含 x,则 index (x) 函数返回 x 的位置值。

          【讨论】:

            【解决方案10】:

            这是我用来将 excel 列字母转换为数字的东西(因此限制为 3 个字母,但如果您需要更多,很容易扩展它)。可能不是最好的方法,但它可以满足我的需要。

            def letter_to_number(letters):
                letters = letters.lower()
                dictionary = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'i':9,'j':10,'k':11,'l':12,'m':13,'n':14,'o':15,'p':16,'q':17,'r':18,'s':19,'t':20,'u':21,'v':22,'w':23,'x':24,'y':25,'z':26}
                strlen = len(letters)
                if strlen == 1:
                    number = dictionary[letters]
                elif strlen == 2:
                    first_letter = letters[0]
                    first_number = dictionary[first_letter]
                    second_letter = letters[1]
                    second_number = dictionary[second_letter]
                    number = (first_number * 26) + second_number
                elif strlen == 3:
                    first_letter = letters[0]
                    first_number = dictionary[first_letter]
                    second_letter = letters[1]
                    second_number = dictionary[second_letter]
                    third_letter = letters[2]
                    third_number = dictionary[third_letter]
                    number = (first_number * 26 * 26) + (second_number * 26) + third_number
                return number
            

            【讨论】:

            【解决方案11】:
            characters = 'abcdefghijklmnopqrstuvwxyz'
            d = {}
            for x in range(len(characters)):
                d[characters[x]] = x+1
            
            print(d)
            

            prints {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26}

            print(d['a']) # 1
            print(d['z']) # 26
            

            【讨论】:

              【解决方案12】:

              如果您只是想将数字映射到字母,那么只需执行以下简单操作:

              def letter_to_index(letter):
                  _alphabet = 'abcdefghijklmnopqrstuvwxyz'
                  return next((i for i, _letter in enumerate(_alphabet) if _letter == letter), None)
              

              当然,如果你想让它从 1 开始,那么只需添加 (i+1 for i, ... etc.

              【讨论】:

                【解决方案13】:

                如果您正在寻找相反的 1 = A 、 2 = B 等,您可以使用以下代码。请注意,我只升了 2 个级别,因为我必须将班级中的部门转换为 A、B、C 等。

                loopvariable = 0 
                    numberofdivisions = 53
                    while (loopvariable <numberofdivisions):
                        if(loopvariable<26):
                            print(chr(65+loopvariable))
                        loopvariable +=1
                        if(loopvariable > 26 and loopvariable <53):
                            print(chr(65)+chr(65+(loopvariable-27)))
                

                【讨论】:

                  【解决方案14】:

                  使用此功能。它将一串字母转换为其等效的数字值:

                  def convAlph2Num(sent):
                      alphArray = list(string.ascii_lowercase)
                      alphSet = set(alphArray)
                      sentArray = list(sent.lower())
                      x = []
                      for u in sentArray:
                          if u in alphSet:
                              u = alphArray.index(u) + 1
                              x.append(u)
                      print(x)
                      return
                  

                  【讨论】:

                  • 你必须导入字符串
                  【解决方案15】:

                  如果目标是只转换字母 abcd....xyz 和 ABCD....XYZ ,我会使用一个函数:

                  from string import letters
                  def rank(x, d = dict((letr,n%26+1) for n,letr in enumerate(letters[0:52]))):
                      return d[x]
                  

                  我写 [0:52] 是因为我的 Python 2.7 版本显示了值

                  *ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz*ƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÔÕÖÙÙÚÛÜÝÞßàááââââãåæçèée>ìíûïðñòóõõ

                  对于 string.letters 参数。

                  因为参数d接收一个值作为默认参数,所以这个值的演算只执行一次,在执行函数定义生成函数对象的那一刻。 因此,即使该函数被上诉了三千次,也可以在没有重新计算该值的情况下使用该函数。

                  顺便说一句,lower() 不会再次用于函数的每次调用。默认参数的构造过程中已经处理了大写字母的大小写。

                  .

                  一个使用示例:

                  word = 'supercalifragilisticexpialidocious'
                  print ''.join( letter if rank(letter)%3!=0 else '.' for letter in word)
                  

                  结果:

                  s.pe..a....ag....st..e.p.a..d.......s

                  .

                  它也可以与 map() 一起使用:

                  print map(rank,'ImmunoElectroPhoresis')
                  

                  结果:

                  [9, 13, 13, 21, 14, 15, 5, 12, 5, 3, 20, 18, 15, 16, 8, 15, 18, 5, 19, 9, 19]

                  【讨论】:

                    【解决方案16】:

                    这是一个非常简单的脚本,可以满足您的要求!试试这个:

                    #!/usr/bin/env python3
                    
                    def remove(string): 
                        return string.replace(" ", "")
                    
                    dict = {'a': '1', 
                        'b': '2',
                        'c': '3',
                        'd': '4',
                        'e': '5',
                        'f': '6',
                        'g': '7',
                        'h': '8',
                        'i': '9',
                        'j': '10',
                        'k': '11',
                        'l': '12',
                        'm': '13',
                        'n': '14',
                        'o': '15',
                        'p': '16',
                        'q': '17',
                        'r': '18',
                        's': '19',
                        't': '20',
                        'u': '21',
                        'v': '22',
                        'w': '23',
                        'x': '24',
                        'y': '25',
                        'z': '26',
                    }
                    
                    word = remove(input(''))
                    
                    for x in word:
                        print(dict[x])
                    
                    ## or ##
                    #index = 0
                    #for x in word:
                    #   print(dict[word[index]])
                    #   index = index + 1
                    

                    【讨论】:

                    • 请解释你的代码是做什么的以及它是怎么做的。
                    • @M-Chen-3 我的代码正是#altin 在他的问题中想要的,即将字母转换为数字。我的代码开头定义的函数是从您将插入的文本中删除空格,因为空格被计为索引。然后我做了'for循环'将插入文本中的每个索引转换为变量'dict'中列出的相应数字。
                    【解决方案17】:
                    import string
                    # Amin
                    my_name = str(input("Enter a your name: "))
                    numbers      = []
                    characters   = []
                    output       = []
                    for x, y in zip(range(1, 27), string.ascii_lowercase):
                        numbers.append(x)
                        characters.append(y)
                    
                    print(numbers)
                    print(characters)
                    print("----------------------------------------------------------------------")
                    
                    input = my_name
                    input = input.lower()
                    
                    for character in input:
                        number = ord(character) - 96
                        output.append(number)
                    print(output)
                    print("----------------------------------------------------------------------")
                    
                    sum = 0
                    lent_out = len(output)
                    for i in range(0,lent_out):
                        sum = sum + output[i]
                    
                    print("resulat sum is : ")
                    print("-----------------")
                    
                    print(sum)
                    
                    
                    
                    
                    
                    resualt is :
                    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
                    ['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']
                    ----------------------------------------------------------------------
                    [1, 13, 9, 14]
                    ----------------------------------------------------------------------
                    resulat sum is : 
                    -----------------
                    37
                    

                    【讨论】:

                      【解决方案18】:

                      对字母上的数字 31 执行 AND 运算会起作用。

                      这是一个例子:

                      str1 = 'abcdefABCDEF'
                      list1 = []
                      
                      for i in str1:
                          list1.append(ord(i) & 31)
                      print(list1)
                      
                      for j in range(0, len(list1)):
                          print(chr(list1[j] + 64), end = '')
                      

                      这样做的结果是:

                      [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
                      ABCDEFABCDEF
                      

                      【讨论】:

                        猜你喜欢
                        • 2021-05-30
                        • 1970-01-01
                        • 2018-12-09
                        • 2016-07-07
                        • 1970-01-01
                        • 2015-03-08
                        相关资源
                        最近更新 更多