【问题标题】:Replace multiple strings at the same time同时替换多个字符串
【发布时间】:2018-04-06 04:01:21
【问题描述】:

假设我有这个字符串“abcd”

现在我想用 'd' 替换所有 'a',并且我想用 'a' 替换所有 'd'。问题是 string.replace 在这种情况下不起作用。

"abcd".replace('a','d').replace('d','a')

abca

预期的输出是“dbca”

我将如何实现这一目标?

【问题讨论】:

标签: python


【解决方案1】:

你可以使用.translate()

返回字符串的副本,其中每个字符已通过给定的转换表映射。

https://docs.python.org/3/library/stdtypes.html#str.translate

例子:

>>> "abcd".translate(str.maketrans("ad","da"))
'dbca'

【讨论】:

    【解决方案2】:

    您可以使用列表推导来切换所需的值

    x = "abcd"
    ''.join(['d' if i == 'a' else 'a' if i == 'd' else i for i in x])
    

    'dbca'


    没有清单

    x = "abcd"
    ''.join('d' if i == 'a' else 'a' if i == 'd' else i for i in x)
    

    'dbca'


    时间

    In [1]: x = "abcd"*10000000
    
    In [2]: %timeit ''.join('d' if i == 'a' else 'a' if i == 'd' else i for i in x)
    5.78 s ± 152 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    In [3]: %timeit ''.join(['d' if i == 'a' else 'a' if i == 'd' else i for i in x])
    4.49 s ± 157 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    事实证明列表理解稍微快了一点。

    【讨论】:

    • 你不需要这个列表,你可以使用一个推导。创建列表总是会损害性能
    • @chrisz 你这里的“理解”是什么意思?列表推导式创建列表
    • @juanpa.arrivillaga 他不需要括号,它们会损害性能。 ''.join('d' if i == 'a' else 'a' if i == 'd' else i for i in x) 工作得很好。我应该说,“你可以只使用一个生成器”
    • @JahKnows 我确实错了,这里的列表更好。 stackoverflow.com/questions/37782066/…我很抱歉
    • 不,实际上,通常除非您的列表非常大,否则列表推导会击败或匹配 生成器表达式。在传递给str.join 的特殊情况下,无论如何都会在后台创建一个列表。
    【解决方案3】:

    你可以试试python替换配方:

    string_word="abcd"
    
    data=list(string_word)
    replace_index=list({j:i for j,i in enumerate(data) if i=='a' or i=='d'}.keys())
    
    data[replace_index[0]],data[replace_index[1]]=data[replace_index[1]],data[replace_index[0]]
    
    print("".join(data))
    

    输出:

    dbca
    

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 2020-08-31
      • 2010-10-06
      • 2022-12-15
      • 2015-12-30
      • 2018-11-27
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多