Python之星之谜

2024-05-18 15:47:52 发布

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

谜语:

返回给定字符串的一个版本,其中对于字符串中的每个星号(*),该星号及其左右两侧的字符都将消失。所以“ab*cd”产生“ad”,而“ab**cd”也产生“ad”

我想知道是否有一种pythonish方法可以改进这个算法:

def starKill(string): 

    result = ''

    for idx in range(len(string)):

        if(idx == 0 and string[idx] != '*'):
            result += string[idx]
        elif (idx > 0 and string[idx] != '*' and (string[idx-1]) != '*'):
            result += string[idx]
        elif (idx > 0 and string[idx] == '*' and (string[idx-1]) != '*'):
            result = result[0:len(result) - 1]

    return result

starKill(“wacy*xko”)收益率


Tags: and字符串版本stringlenabcdresult
3条回答

以下是一个有趣的numpy解决方案:

def star_kill(string, target='*'):
    arr = np.array(list(string))
    mask = arr != '*'
    mask[1:] &= mask[:-1]
    mask[:-1] &= mask[1:]
    arr = arr[mask]
    return arr[mask].view(dtype=f'U{arr.size}').item()

不确定它是否是“Pythonic”,但这个问题可以用正则表达式解决

import re

def starkill(s):
  s = re.sub(".{0,1}\\*{1,}.{0,1}", "", s)
  return s

对于那些不熟悉正则表达式的人,我将把这个长字符串分解为:

前缀

".{0,1}"

这指定我们希望替换的部分以任何字符的0或1开头。如果星星前面有一个字符,我们要替换它;否则,如果星号位于输入字符串的最开头,我们仍然希望表达式命中

明星

"\\*{1,}"

这指定表达式中间必须包含星号字符,但也可以包含多个星号字符。例如,“a****b”仍然会流行,即使有四颗星。我们需要在星号之前加一个反斜杠,因为正则表达式将星号作为保留字符,而在之前加一个反斜杠,因为Python字符串保留反斜杠字符

后缀

.{0,1}

与前缀相同。表达式可以以任意字符的一或零结尾

希望有帮助

正则表达式

>>> import re
>>> for s in "ab*cd", "ab**cd", "wacy*xko", "*Mad*Physicist*":
        print(re.sub(r'\w?\*\w?', '', s))

ad
ad
wacko
ahysicis

相关问题 更多 >

    热门问题