Python中的字符串替换列表

Tei*_*ion 30 python string replace

是否有一个更短的方式来编写以下代码?

my_string = my_string.replace('A', '1')
my_string = my_string.replace('B', '2')
my_string = my_string.replace('C', '3')
my_string = my_string.replace('D', '4')
my_string = my_string.replace('E', '5')
Run Code Online (Sandbox Code Playgroud)

请注意,我不需要替换那些确切的值; 我只是想找到一种方法将5+行变成少于5行

Ric*_*and 58

看起来像是一个使用循环的好机会:

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
for k, v in mapping.iteritems():
    my_string = my_string.replace(k, v)
Run Code Online (Sandbox Code Playgroud)

如果你不介意括号,更快的方法是:

mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ]
for k, v in mapping:
    my_string = my_string.replace(k, v)
Run Code Online (Sandbox Code Playgroud)

  • 一种更简洁的方法来定义`mapping = zip(list('ABCDE'),range(1,6))` (4认同)
  • 这很奇怪; 这就是我写它的方式,因为问题在于从一个字符到另一个字符的映射。但实际上,您并没有将 dict 用作​​ dict;您将其用作元组列表。那么为什么不首先写一个元组列表呢? (2认同)
  • 如果你有这个映射{'A':'1','1':'A'}可能结果与预期不一样怎么办? (2认同)
  • 对于 Python 3,使用 `.items()` 而不是 `.iteritems()` (2认同)

Mat*_*kel 40

您可以轻松使用string.maketrans()创建传递给str.translate()的映射字符串:

import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是同时替换**字符列表的唯一正确方法.例如,如果你做''<>'.替换('<','>').replace('>','<')`你会得到''<<'`,但翻译你会得到` '> <'`. (5认同)
  • 这很好,但在多字符模式或替换的情况下不起作用 (2认同)
  • 在 python 3 中它是 str.maketrans("ABCDE", "12345") (2认同)

Art*_*ius 14

另外看看str.translate().它根据您为Unicode字符串提供的映射替换字符,否则必须告知要将每个字符从chr(0)替换为chr(255).


Dar*_*con 12

如果你想慢慢得到错误的答案,那么在循环中使用string.replace.(虽然它在这种模式和替换之间没有重叠的情况下确实有效.)

对于可能重叠或长主题字符串的一般情况,请使用re.sub:

import re

def multisub(subs, subject):
    "Simultaneously perform all substitutions on the subject string."
    pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs)
    substs = [s for p, s in subs]
    replace = lambda m: substs[m.lastindex - 1]
    return re.sub(pattern, replace, subject)

>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye')
'bye and hi'
Run Code Online (Sandbox Code Playgroud)

对于单字符模式和1-或0字符替换的特殊情况,请使用string.maketrans.

  • str.replace可以给出一个可以说是错误的答案.对于基于字典的解决方案,请考虑字符串"wow"和翻译表{'w':'foo','o':'bar'}.根据dict迭代的顺序,您可能会得到不同的结果:"fbarbarbarfbarbar"或"foobarfoo".可以说,为同等输入提供不同输出的功能可以被打破. (2认同)
  • 迈尔斯,是的,这就是我的意思。您也可能会在单独的键中遇到重叠,例如“hello”和“hell”。 (2认同)

Ste*_*all 8

replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}       
for key, replacement in replaceDict.items():  
  my_string = my_string.replace( key, replacement )


小智 6

我认为这可能会更有效一些:

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
my_string = "".join([mapping[c] if c in mapping else c for c in my_string])
Run Code Online (Sandbox Code Playgroud)

我建议使用“timeit”进行一些基准测试,并以“my_string”长度为基础的真实案例。