在Python 2.7中,如何将'abc'解析为'a b c'中的一个很长的字符串(如1000个字符)?
或者我如何将'abccda'转换为'1 2 3 3 4 1'? (每个独特的字母映射到一个唯一的数字,1-4)
我想我可以一个接一个地弹出这些字符,但我是Python的新手,并想知道是否有一个简单的函数可以实现它。
答案 0 :(得分:3)
对于第一个使用join()
:
>>> s = 'abc'
>>> ' '.join(s)
'a b c'
对于第二个:
>>> s = 'abccda'
>>> ' '.join(chr(ord(c)-ord('a')+ord('1')) for c in s)
'1 2 3 3 4 1'
或者您可以简单地使用字典将字母映射到数字:
>>> s = 'abccda'
>>> d = dict(a=1, b=2, c=3, d=4)
>>> ' '.join(str(d[c]) for c in s)
'1 2 3 3 4 1'
另一种方法是使用string.translate()
:
>>> from string import maketrans
>>> s = 'abccda'
>>> ' '.join(s.translate(maketrans('abcd', '1234')))
'1 2 3 3 4 1'
translate()
将是首选的,因为与天真的字典查找相反,它处理未映射的字符而没有错误:
>>> s='abcdefgh'
>>> ' '.join(s.translate(maketrans('abcd', '1234')))
'1 2 3 4 e f g h'
答案 1 :(得分:1)
x="abc"
print re.sub(r"(?<!^)(.)",r" \1",x)
对于简单转换,您可以尝试此操作。对于映射,您可以在repl
中定义re.sub
函数。示例可以是
def repl(matchobj):
if matchobj.group()=='b':
return " "+str(1)
elif matchobj.group()=='c':
return " "+str(2)
x="abc"
print re.sub(r"(?<!^)(.)",repl,x)
答案 2 :(得分:1)
你的意思是列表方法吗?
S = 'abccda'
list(s)#['a','b','c','c','d','a']
答案 3 :(得分:1)
要将每个字母转换为数字,您可以使用str.translate
。在这个简单的案例中,这可能有点过头了,但值得学习。
Python 2和Python 3中的细节不同。
对于Python 3,您可以使用从Unicode序列到替换字符串的映射,如下所示:
mapping = {ord(letter): str(number) for number, letter in enumerate(string.ascii_lowercase[:4], 1)}
translated = x.translate(mapping)
对于Python 2,你需要一个特殊的转换表,在这种情况下它不太方便(并且只允许你将字符翻译成单个字符,而不是像Python 3版本那样的任意字符串 - 这里不是问题,但是,如果您想将'j'
转换为'10
,那么它将不起作用):
mapping = string.maketrans(string.ascii_lowercase[:4],
''.join(str(i) for i in range(1, 5))
translated = x.translate(mapping)
然后,要添加空格,请使用mhawke's solution:
result = ' '.join(translated)