Python多字符翻译

7 投票
5 回答
7888 浏览
提问于 2025-04-18 16:32

我正在尝试用Python 3.3.3写一个程序,这个程序可以把一个字符串转换成数字(1到26)。

我知道怎么把一个字符转换成一个数字,但对于两个字符的情况就不知道该怎么做了。

translist = str.maketrans("123456789", "ABCDEFGHI")

有没有什么办法可以做到这一点呢?

5 个回答

0

最近我遇到了和Sam一样的问题。所以我在网上搜索了一些关键词,找到了我的解决办法。

http://code.activestate.com/recipes/81330-single-pass-multiple-replace/

顺便说一下,这个方法可能会稍微慢一点,但在我的情况下很有用。

希望对你有帮助,抱歉我的英语不好。

0

你可以使用列表推导式、格式化和映射来处理数据:

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

我之前也遇到过同样的问题,最后用一行代码解决了它:

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

3

我并不是最棒的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)
7

你想做的事情用 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'

撰写回答