如何完成以下操作?
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<在字母表中。
答案 0 :(得分:71)
这样的事情:
print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]
ord
list comprehension
ASCII character codes
修改强>
既然你让我解释我会...虽然已经在[?]的评论中得到了很好的解释。
让我们在更多的一行开始。
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是你的朋友。我希望这会有所帮助。
答案 1 :(得分:11)
您可以使用chr()和ord()来转换字母和整数。
这是一个简单的例子。
>>> chr(97)
'a'
>>> ord('a')
97
答案 2 :(得分:8)
不要太基础,但是这个:
>>> 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。
如果你有sequence个字符'a'到'z'和/或'A'到'Z',你可以轻松返回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]]
答案 3 :(得分:8)
如果您打算大量使用此转换,请考虑计算一次并将结果放入字典中:
>>> 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....
答案 4 :(得分:6)
这是我过去常用的功能。适用于大写和小写。
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
答案 5 :(得分:5)
像 this
之类的东西[str(ord(c)&31) for c in text]
答案 6 :(得分:4)
您可以将字母映射到一个列表,并按如下所示返回每个字母的索引:
import string
alphabet=string.ascii_lowercase
#alphabet='abcdefghijklmnopqrstuvwxyz'
#Get the character index , ex: e
print(chars.find('e'))
#This will return 4
答案 7 :(得分:2)
这里有一些我用来将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
答案 8 :(得分:2)
def letter_to_int(letter):
alphabet = list('abcdefghijklmnopqrstuvwxyz')
return alphabet.index(letter) + 1
这里,如果列表包含x,则index(x)函数返回x的位置值。
答案 9 :(得分:2)
>>> [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']
答案 10 :(得分:1)
如果您只想将数字映射到一个字母,那么只需执行以下简单的操作:
def letter_to_index(letter):
_alphabet = 'abcdefghijklmnopqrstuvwxyz'
return next((i for i, _letter in enumerate(_alphabet) if _letter == letter), None)
当然如果你想让它从1开始,那么只需添加(i + 1代表我,等等。
答案 11 :(得分:1)
如果目标只是转换字母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 接收一个值作为默认参数,所以在执行函数定义以生成函数对象时,此值的微积分仅执行一次。 因此,即使该函数被上诉了三千次,也可以在不重新计算该值的情况下使用该函数。
顺便说一下,对于函数的每个上诉,不再使用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 .....小号
它也可以与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]
答案 12 :(得分:1)
如果您正在查看相反的内容,例如1 = A,2 = B等,则可以使用以下代码。请注意,由于我必须将班级中的部门转换为A,B,C等,因此我最多只能达到2级。
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)))
答案 13 :(得分:1)
使用此功能。它将一串字母表转换为其等效的数字值:
axis = (^-^) <$> candle^.high <*> candle^.low
答案 14 :(得分:1)
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
答案 15 :(得分:0)
这是我的解决方案,您希望将字母表中的所有字母转换为英文字母中这些字母的位置,并返回这些字符串。
https://gist.github.com/bondnotanymore/e0f1dcaacfb782348e74fac8b224769e
如果您想详细了解它,请告诉我。我使用了以下概念 - 列表理解 - 字典理解
答案 16 :(得分:0)
public record User
答案 17 :(得分:0)
这是非常简单的脚本,可以完成您所要的!试试这个:
#!/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