【发布时间】:2014-10-01 20:17:24
【问题描述】:
我正在尝试在 python 3.3.3 中创建一个程序,它将接受一个字符串然后将其转换为数字 (1-26)
我知道怎么做一个数字,但不是 2
translist = str.maketrans("123456789", "ABCDEFGHI")
有没有办法做到这一点
【问题讨论】:
标签: python string python-3.x translate
我正在尝试在 python 3.3.3 中创建一个程序,它将接受一个字符串然后将其转换为数字 (1-26)
我知道怎么做一个数字,但不是 2
translist = str.maketrans("123456789", "ABCDEFGHI")
有没有办法做到这一点
【问题讨论】:
标签: python string python-3.x translate
你不能用str.translate()做你想做的事;这只适用于一对一的替换。您试图在此处用 两个不同的字符替换一个字符。
您可以改用正则表达式:
re.sub('[A-Z]', lambda m: str(ord(m.group()) - 64), inputstring)
这需要每个字母的 ASCII 码位并减去 64(A 在 ASCII 标准中是 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?你可能想用 0 填充你的数字:
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'
【讨论】:
() 括号正确平衡。
您可以使用列表推导、格式和映射:
>>> 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'
【讨论】:
最近我遇到了和 Sam 一样的问题。所以我搜索了一些关键字并找到了我的解决方案。
http://code.activestate.com/recipes/81330-single-pass-multiple-replace/
顺便说一句,这种方法可能会慢一点,但对我的情况很有用。
希望对您有所帮助,并为我的英语不好感到抱歉。
【讨论】:
我绝不是最好的 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)
【讨论】:
我也有同样的问题要解决,并且能够用 oneliner 解决它:
def replace(s, r):
return ''.join([r.get(x, x) for x in s])
此函数采用要迭代的字符串和替换字典,键是要查找的字符,值是替换字符。理解遍历字符串的字符,如果字符是替换字典中的键,它将使用该值,否则只返回字符。然后我们用join 函数将它收集回一个字符串。
我的用例是编写一个简单的 url percent-encoder:
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])
【讨论】: