Python多字符翻译
我正在尝试用Python 3.3.3写一个程序,这个程序可以把一个字符串转换成数字(1到26)。
我知道怎么把一个字符转换成一个数字,但对于两个字符的情况就不知道该怎么做了。
translist = str.maketrans("123456789", "ABCDEFGHI")
有没有什么办法可以做到这一点呢?
5 个回答
最近我遇到了和Sam一样的问题。所以我在网上搜索了一些关键词,找到了我的解决办法。
http://code.activestate.com/recipes/81330-single-pass-multiple-replace/
顺便说一下,这个方法可能会稍微慢一点,但在我的情况下很有用。
希望对你有帮助,抱歉我的英语不好。
你可以使用列表推导式、格式化和映射来处理数据:
>>> s='ABCXYZ'
>>> [format(oc, '02d') for oc in map(ord, s)]
['65', '66', '67', '88', '89', '90']
如果你想的话,可以把这些结果重新合并成一个字符串:
>>> ''.join([format(oc, '02d') for oc in map(ord, s)])
'656667888990'
我之前也遇到过同样的问题,最后用一行代码解决了它:
def replace(s, r):
return ''.join([r.get(x, x) for x in s])
这个函数的作用是处理一个字符串,并且用一个字典来替换字符。字典里的键是要查找的字符,值是用来替换的字符。这个过程会逐个检查字符串里的字符,如果这个字符在字典的键里,就用对应的值替换它;如果不在,就保持原样。最后,我们用 join
函数把这些字符重新组合成一个字符串。
我用这个方法是为了写一个简单的 URL 百分号编码器:
def url_encode(s):
r = {
"!":"%21",
"#":"%23",
"$":"%24",
"%":"%25",
"&":"%26",
"'":"%27",
"(":"%28",
")":"%29",
"*":"%2A",
"+":"%2B",
",":"%2C",
"/":"%2F",
":":"%3A",
";":"%3B",
"=":"%3D",
"?":"%3F",
"@":"%40",
"[":"%5B",
"]":"%5D",
}
return replace(s, r)
def replace(s, r):
return ''.join([r.get(x, x) for x in s])
我并不是最棒的Python程序员(我还在学习的路上),不过这段代码看起来能满足你的需求。
首先,创建一个字典,像这样:
abc = {"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"}
然后你可以这样做:
txt = str(input("Text: ")).upper()
ntxt = ""
for char in txt:
if char in abc:
ntxt += abc[char]
else:
ntxt += char
print("New string:", ntxt)
你想做的事情用 str.translate()
是不行的;这个方法只能用来一对一地替换字符。而你这里是想把一个字符替换成两个不同的字符。
你可以试试用正则表达式来解决这个问题:
re.sub('[A-Z]', lambda m: str(ord(m.group()) - 64), inputstring)
这个方法会取每个字母的ASCII码,然后减去64(在ASCII标准中,A
的值是65)。
需要注意的是,这可能会导致一些让人困惑的情况:
>>> import re
>>> inputstring = 'FOO BAR BAZ'
>>> re.sub('[A-Z]', lambda m: str(ord(m.group()) - 64), inputstring)
'61515 2118 2126'
比如说,6 1 5 1 5
是不是和 6 15 15
是同一组数字?你可能想给你的数字加上前导零:
re.sub('[A-Z]', lambda m: format(ord(m.group()) - 64, '02d'), inputstring)
这样会得到:
>>> re.sub('[A-Z]', lambda m: format(ord(m.group()) - 64, '02d'), inputstring)
'061515 020118 020126'