2024-10-06 07:45:09 发布
网友
编写一个函数,将字符串的第一个字母的每个重复字符替换为*除了第一个字母本身-有没有比这更符合python/优雅的方法(列表等)?
def specialreplace(s): firstchar = s[0] modifiedstr = s[1:].replace(firstchar, "*") print firstchar + modifiedstr specialreplace('oompaloompa') ---> o*mpal**mpa
这是个简单的问题,我不知道你为什么要把它复杂化。您的解决方案看起来不错,除了应该使用.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
您正在引发一个毫无意义的函数调用,它使代码可读性降低,并且总体上降低了性能。
我完全赞成为了可读性而牺牲性能,但不是牺牲性能和可读性。
这是个简单的问题,我不知道你为什么要把它复杂化。您的解决方案看起来不错,除了应该使用.join()而不是“+”将字符串连接在一起。
您可以使用枚举:
但那只是为了好玩,我会坚持你自己的解决方案。
要回答您的评论,可以使用多个映射将多个字符替换为translate:
在python3中,需要一个表,使用每个字符的ord作为键:
也可以使用re.sub忽略第一个字符:
但又有点过分了。
这里不是推荐的方法,除非你反复地这样做(对于每个字母,多次),而是另一种方法:
我在速度上错了。再加上Python3的不同。
编辑:不要对字符串使用join。没有理由这么做。
您正在引发一个毫无意义的函数调用,它使代码可读性降低,并且总体上降低了性能。
我完全赞成为了可读性而牺牲性能,但不是牺牲性能和可读性。
相关问题 更多 >
编程相关推荐