Discuss / Python / 至少有四种思路来写

至少有四种思路来写

Topic source

第一种,使用两个 for/while 循环,分别去掉字符串首尾的空格。其中最简洁的写法已经有多位同学写出,借鉴如下:

def trim(s):
    while s[-1:] == ' ':
        s = s[:-1]
    while s[:1] == ' ':
        s = s[1:]
    return s

第二种,鉴于很多循环都可以写成递归函数的形式,因此使用递归函数写法也能写出,评论中也有同学写出来,大家可以翻一下评论参考一下。

第三种,仅使用一次 while 循环,将字符串转成列表,利用列表翻转的方法实现:

def trim(s):
    if s:
        l = list(s)
        n = 0
        while n < 2:
            if l[0] == " ":
                del l[0]
                if not l:
                    return ""
                continue
            l.reverse()
            n += 1
        return "".join(l)
    else:
        return ""

第四种,仅使用一个 for 循环,通过 enumerate 函数获取首尾非空格的索引,直接截断字符串:

def trim(s):
    s_len = len(s) 
    begin = end = s_len
    for i, a in enumerate(s):
        if a != " " and begin == s_len: 
            begin = i
        if a == " " and begin != s_len and s[i-1] != " ":
            end = i
    s = s[begin:end]
    return s

对于写法一中的一个疑问点:为什么使用 s[:1] 可以,而使用 s[0] 会报错,这是因为:

s[0] 表示索引(index),s[:1] 表示切片(slice),这两个操作在 python 内部的实现原理是不同的。仅当操作对象是字符串,且字符串不为空时,s[0]和s[:1]的表现结果"恰好"一致。对于列表和元组,这两种写法的结果并不相同。示例如下:

>>> l = [1,2,3]
>>> l[0]
1
>>> l[:1]
[1]
>>> s = "abc"
>>> s[0]
'a'
>>> s[:1]
'a'
>>> t = (1,2,3)
>>> t[0]
1
>>> t[:1]
(1,)

因此这两种方法不能混用。

参考链接:

Python String index out of range, difference between s[0] and s[:1] [duplicate]

Why does substring slicing with index out of range work?

为什么第一种用if不可以用while就可以测试成功?

因为测试里的字符串不止包含一个空格,使用 if 只会判断一次开头字符,切片之后还是存在空格在字符串中


  • 1

Reply