簡體   English   中英

在 Python 中將字母轉換為數字

[英]Convert alphabet letters to number in Python

以下如何完成?

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 < 在字母表中。

這樣的事情怎么樣:

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

順序
列表理解
ASCII 字符代碼

編輯
既然你要我解釋,我會……盡管[?] 在評論中已經很好地解釋了。

讓我們從一行開始。

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 代表 ordinal,幾乎每種高級語言都有這種類型的函數可用。 它為您提供了到任何字符的數字表示的映射。 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 是您的朋友。 我希望這會有所幫助。

您可以使用 chr() 和 ord() 在字母和整數之間進行轉換。

這是一個簡單的例子。

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

不要太基本,但這個:

>>> 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的單個字符轉換為可迭代的需要額外的步驟。

如果您有字符 'a' 到 'z' 和/或 'A' 到 'Z' 的序列,您可以輕松地使用列表理解返回字符的編號:

>>> [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]]

如果您要大量使用此轉換,請考慮計算一次並將結果放入字典中:

>>> 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....

這是我曾經用於此目的的函數。 適用於大寫和小寫。

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

您可以將字母表映射到列表並按照以下方式返回每個字母表的索引:

import string

alphabet=string.ascii_lowercase
#alphabet='abcdefghijklmnopqrstuvwxyz'

#Get the character index , ex: e  
print(chars.find('e'))
#This will return 4

這樣的東西

[str(ord(c)&31) for c in text]
def letter_to_int(letter):
    alphabet = list('abcdefghijklmnopqrstuvwxyz')
    return alphabet.index(letter) + 1

在這里,如果列表包含 x,則 index (x) 函數返回 x 的位置值。

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

這是我用來將 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

如果您只是想將數字映射到字母,那么只需執行以下簡單操作:

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, ... 等。

如果您看起來相反,例如 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)))

使用此功能。 它將字母字符串轉換為其等效的數字值:

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
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

如果目標是只轉換字母 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 *ƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÒÒÔÔÿÖÙÚþþþþþþþþþþþþþþþþþþþþþþþþþþþþÍÀ?

對於 string.letters 參數。

因為參數d接收一個值作為默認參數,這個值的演算只執行一次,在執行函數定義以生成函數對象的那一刻。 因此,即使該函數被調用 3000 次,也可以使用該函數而無需再次計算該值。

順便說一句,lower() 不再用於函數的每次調用。 大寫字母的大小寫已在默認參數的構造過程中得到處理。

.

使用示例之一:

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

結果:

s.pe..a....ag...st..epa.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]

如何完成以下步驟?

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: ')

我試圖通過多種方法解決它,但無法做到。 我想做事。 如果我鍵入“ hello”,則輸出的數字將按字母順序排列。 示例a = 1 <字母。

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

這是一個非常簡單的腳本來完成你的要求! 試試這個:

#!/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

用字母上的數字 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM