Python字符串替换,除了第一个ch

2024-10-06 07:45:09 发布

您现在位置:Python中文网/ 问答频道 /正文

编写一个函数,将字符串的第一个字母的每个重复字符替换为*除了第一个字母本身-有没有比这更符合python/优雅的方法(列表等)?

def specialreplace(s):
    firstchar = s[0]
    modifiedstr = s[1:].replace(firstchar, "*")
    print firstchar + modifiedstr

specialreplace('oompaloompa') ---> o*mpal**mpa

Tags: 方法函数字符串列表def字母字符replace
3条回答

这是个简单的问题,我不知道你为什么要把它复杂化。您的解决方案看起来不错,除了应该使用.join()而不是“+”将字符串连接在一起。

"".join((s[0], s[1:].replace(s[0], "*"))

您可以使用枚举:

print("".join(["*" if s[i] == s[0] and i != 0 else ch for i, ch in enumerate(s)]))

但那只是为了好玩,我会坚持你自己的解决方案。

要回答您的评论,可以使用多个映射将多个字符替换为translate:

from string import maketrans
print(s[0]+s[1:].translate(maketrans(s[0]+s[2]+s[3],"*$!")))
o*$!al**$!a

在python3中,需要一个表,使用每个字符的ord作为键:

print(s[0]+s[1:].translate((dict(zip((ord(s[0]),ord(s[2]),ord(s[3])),"*$!")))))
o*$!al**$!a

也可以使用re.sub忽略第一个字符:

s = 'oompaloompa'

from re import sub

print(sub(r"(?<!^)"+s[0], "*", s))
o*mpal**mpa

但又有点过分了。

这里不是推荐的方法,除非你反复地这样做(对于每个字母,多次),而是另一种方法:

我在速度上错了。再加上Python3的不同。

import string
a = 'ababc'
firstchar = a[0]
trantab = string.maketrans(firstchar, '*')

def translate(mystr, firschar):
    trantab = string.maketrans(firstchar, '*')
    return firstchar + string.translate(mystr[1:], trantab)

def translate_iter(mystr, firschar, trantab):
    return firstchar + string.translate(mystr[1:], trantab)

def replace(mystr, firstchar):
    return firstchar + mystr[1:].replace(firstchar, '*')

In [29]: %timeit translate(a, firstchar)
1000000 loops, best of 3: 582 ns per loop

In [30]: %timeit replace(a, firstchar)
1000000 loops, best of 3: 240 ns per loop

In [32]: %timeit translate_iter(a, firstchar, trantab)
1000000 loops, best of 3: 376 ns per loop

编辑:不要对字符串使用join。没有理由这么做。

import dis
In [36]: def add(a,b):
    return a+b
   ....: 

In [37]: def join(a,b):
    return join((a,b))
   ....: 

In [42]: dis.dis(add)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BINARY_ADD          
              7 RETURN_VALUE        

In [43]: dis.dis(join)
  2           0 LOAD_GLOBAL              0 (join)
              3 LOAD_FAST                0 (a)
              6 LOAD_FAST                1 (b)
              9 BUILD_TUPLE              2
             12 CALL_FUNCTION            1
             15 RETURN_VALUE 

您正在引发一个毫无意义的函数调用,它使代码可读性降低,并且总体上降低了性能。

我完全赞成为了可读性而牺牲性能,但不是牺牲性能和可读性。

相关问题 更多 >