一道Python练习题引发的,一个知识点的探讨:删除列表中特定元素的几种方法

题目如下:

给定一个仅包含大小写字母和空格 ‘ ‘ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。

示例:

输入: "Hello World"
输出: 5

先说下我的思路:

题目要求给一个字符串s,s仅包含字母和空格字符,要求返回最后一个单词的长度,考虑如下几点

1、如果s是空字符,即s=””,此时应该返回0;

2、如果s只包含空格字符,即s=” “,此时也应该返回0;

3、如果s既包含字母也包含空格(或者只包含字母),可以通过split()函数,用一个空格字符切割,这样就可以得到一个列表,这个列表只由连续的字母和空字符组成,然后把列表中的所有空字符删除,最后把列表中的最后一项的长度返回即可;

所以现在的问题就转化为:如何删除一个列表中的特定元素,这里的话,就是删除列表中的空字符,即””

方法1:

借助一个临时列表,把非空元素提取到临时列表中,然后取出临时列表最后一项,返回其长度即可

这是最笨的方法,实际运行时也是最耗时的方法

class Solution(object):
    def lengthOfLastWord(self, s):
"""
        :type s: str
        :rtype: int
"""
        if s.isspace():  # 判断s是否只由空格字符组成,如s=="   "
            return 0
        elif s == "":  # 判断s是否为空字符串,如s==""
            return 0
        else:  # 如果s不为空,且不全是由空格组成
            temp = s.split(" ")  # 通过split方法,用一个空格字符将字符串s进行切割,可以得到由单词和空字符串组成的列表,将列表赋给temp
            new = []  # 定义一个空列表,作为中间变量
            for t in temp:  # 遍历temp,把非空元素提取到new中,最后把new的最后一项的长度返回即可
                if t != "":
                    new.append(t)
            return len(new[-1])

在说方法2之前,说一个错误的方法:使用for循环,正向遍历列表,删除其中的空字符,如下

s = ["","","a", "a", "a","","",""]
for i in range(0,len(s)):
    if s[i] == "":
        del s[i]
print(s)

运行上述代码,会报错

一道Python练习题引发的,一个知识点的探讨:删除列表中特定元素的几种方法
原因是当遇到空字符时,把空字符删掉后,列表长度变小了,但是循环遍历时,还是按照最初的长度遍历,导致溢出;

另外这样写还存在一个弊端:可能会漏删某些空字符,原因是当删掉前面的空字符后,后面的元素依次向前移动,导致索引与原先对应的值发生变化,如下

b = ["","","a", "a", "a","","",""]
for i in range(0,len(b)):
    if i >= len(b):  # 加一个判断,当i大于列表长度时,跳出循环,避免报错
        break
    if b[i] == "":
        del b[i]
print(b)

一道Python练习题引发的,一个知识点的探讨:删除列表中特定元素的几种方法

所以我们在解决这个问题前,不能用for循环来正向遍历列表

方法2:使用while循环

因为for循环无法达到目的,所以考虑使用while循环,如下

class Solution(object):
    def lengthOfLastWord(self, s):
"""
        :type s: str
        :rtype: int
"""

        if s.isspace():  # 判断s是否只由空格字符组成,如s=="   "
            return 0
        elif s == "":  # 判断s是否为空字符串,如s==""
            return 0
        else:  # 如果s不为空,且不全是由空格组成
            temp = s.split(" ")  # 通过split方法,用一个空格字符将字符串s进行切割,可以得到由单词和空字符串组成的列表,将列表赋给temp
            i = 0  # 设置初始指针,定为0
            while i < len(temp):  # 使用while循环,当指针i的值小于列表temp的长度时,则一直循环
                if temp[i] == "":  # 从索引0开始,如果temp[i]为空
                    del temp[i]  # 则删除该索引对应的值,也就是删除temp[i]
                    i -=1  # 删除之后,由于列表整体长度变小了1位(也就是后面的元素都往前提了一位),所以索引i需要减1,以便下次遍历时不丢掉挨着的元素
                i += 1 # 判断完索引i后,给索引自增1,进行下一轮判断
            return len(temp[-1])  # temp所有元素遍历完成后,就剔除了所有空字符串,取出最后一项的长度返回即可

方法3:for循环倒序删除空字符串

刚才说了使用for循环时,正向遍历会导致溢出或者结果出错,但是从后向前遍历是可以的

class Solution(object):
    def lengthOfLastWord(self, s):
"""
        倒序循环删除空字符串
        :type s: str
        :rtype: int
"""

        if s.isspace():  # 判断s是否只由空格字符组成,如s=="   "
            return 0
        elif s == "":  # 判断s是否为空字符串,如s==""
            return 0
        else:  # 如果s不为空,且不全是由空格组成
            temp = s.split(" ")  # 通过split方法,用一个空格字符将字符串s进行切割,可以得到由单词和空字符串组成的列表,将列表赋给temp
            for i in range(len(temp)-1, -1, -1):  # 倒序循环删除空字符串
                if temp[i] == "":
                    del temp[i]
        return len(temp[-1])

方法4:拷贝原列表,然后遍历拷贝的列表来找出空字符,最后再原列表中删除空字符

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Solution(object):
    def lengthOfLastWord_3(self, s):
"""
        :type s: str
        :rtype: int
"""

        if s.isspace():  # 判断s是否只由空格字符组成,如s=="   ",用isspace()函数判断
            return 0
        elif s == "":  # 判断s是否为空字符串,如s==""
            return 0
        else:  # 如果s不为空,且不全是由空格组成
            temp = s.split(" ")  # 通过split方法,用一个空格字符将字符串s进行切割,可以得到由单词和空字符串组成的列表,将列表赋给temp

            for i in temp[:]:   # temp[:]是对原始的temp的一个拷贝,是一个新的list,所以,我们遍历新的list,而删除原始的list中的元素
                if i == "":
                    temp.remove(i)
        return len(temp[-1])

这样理解一下:假如有一个列表s = [1,1,2,3,4,4,3,1],现在要把里面的1都删掉

我们先拷贝s,得到一个新列表(注意不能用一个变量直接等于s,如a=s,其实a和s都指向同一个列表,本质还是一个),新列表的元素与原列表完全相同

然后遍历新列表,当遇到某个元素的值为1时,就在原列表中把这个元素删掉(使用列表的remove方法删除),因为remove在删除元素时,只会删掉遇到的第一个目标元素,所以我们继续遍历新列表,如果再遇到1,就继续在原列表中删除,

最终遍历完新列表,也就会在原列表中把所有1都删掉了

上述代码中的temp[:]是拷贝原列表得到新列表的一个方法,也可以通过如下方法复制得到一个新列表

>>> new_temp = temp[:]
>>> new_temp = list(temp)
>>> new_temp = temp*1
>>> import copy
>>> new_temp = copy.copy(temp)

Original: https://www.cnblogs.com/python1111/p/16303717.html
Author: 小小程序员ol
Title: 一道Python练习题引发的,一个知识点的探讨:删除列表中特定元素的几种方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/591386/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Numpy:数组对象(Ndarray)的定义和创建

    数组定义 数组对象(Ndarray)是一个组合词,其中:N为数字,d(dimension)维度,array(数组),也可以称为N维数组。 创建数组 创建数组的方法有很多种,通过功能…

    Python 2023年8月28日
    072
  • Pytest测试框架

    Pytest介绍Pytest文档:https://docs.pytest.org/en/latest/contents.html#toc第三方库:https://pypi.org/…

    Python 2023年9月13日
    045
  • 工作经验总结——开发与协作的坑(1)

    文章背景:在公司工作时与后端开发同事合作开发了算法自动化测试Web平台,具体有什么些功能,工作原因需要保密。大部分基础服务都是PHP语言开发的,算法测试的主要工作楼主用的Pytho…

    Python 2023年8月6日
    064
  • Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决

    前言 在学习《Python从入门到精通(第2版)》的第15章 GUI界面编程——15.2.4 将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学…

    Python 2023年10月30日
    046
  • pytest

    1.pytest 是python的一种 单元测试框架,同自带的 unittest 测试框架类似,但更简洁,效率更高。 特点: 易上手 支持单元测试和功能测试 支持参数化 执行测试过…

    Python 2023年9月14日
    034
  • python反爬与反反爬 (二) ajax

    文章目录 反爬 爬虫 * 方案 – 1.解析js 2.selenium + 下载selenium 下载Chrome驱动 添加到环境变量 编写代码 反爬 ajax使用js…

    Python 2023年8月13日
    089
  • 如何实现高性能网络编程-ChatGPT怎么看

    hi ,大家好,我是大师兄。 听说最近chatgpt特别火,那我们邀请一下chatgpt如何实现: 我们先来小试牛刀: 刚开始用先用英文交流一下,然后试一下中文: 元芳你怎么看? …

    Python 2023年11月4日
    044
  • 5.Django 数据库多表查询

    文章目录 * – + 1. 测试环境搭建 + * 1.1 创建项目 * 1.2 解决问题 * 1.3 数据库配置 * 1.4 Pycharm连接数据库 * 1.5 测试…

    Python 2023年8月5日
    065
  • ARIMA(p,d,q)模型原理及其实现 ——–python

    1.简介 ARIMA模型(Autoregressive Integrated Moving Average model),差分整合移动平均自回归模型,又称整合移动平均自回归模型,时…

    Python 2023年7月31日
    088
  • Pandas知识点-详解转换函数transform

    Pandas知识点-详解转换函数transform transform()是pandas中的转换函数,对DataFrame执行传入的函数后返回一个相同形状的DataFrame。用于…

    Python 2023年8月16日
    058
  • 2. 无门槛学会数据类型与输入、输出函数,滚雪球学 Python python 入门教程非常详细

    学习一门语言应该是一件充满乐趣的事情,为什么要把它变难呢? 已完成的文章 标题 链接 1. 这才是 Python 学习的正确起手姿势,滚雪球学 Pythonhttps://drea…

    Python 2023年6月3日
    080
  • Python学习三天计划-1

    一、第一个Python程序 配置好环境变量后 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python解释器的作用是 将Python…

    Python 2023年10月31日
    039
  • pytest最好的测试框架

    前言 简单灵活,容易上手;支持参数化; 测试用例的skip和xfail处理; 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口…

    Python 2023年9月14日
    051
  • Python列表推导式(更有风格的Python代码写法)

    所谓推导式也就是Python中一种更有风格的Python代码的写法。什么样是有风格的呢?假如有个需求,它可能需要三行五行甚至是更多行代码完成,但是如果是同样的需求用推导式来书写的话…

    Python 2023年8月2日
    041
  • 如何在 Django 项目中使用 MQTT

    MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行…

    Python 2023年8月6日
    0104
  • 深入浅出PyTorch——PyTorch可视化

    1. 可视化网络结构 在复杂的网络结构中确定每一层的输入结构,方便我们在短时间内完成debug 1.1 使用print函数打印模型基础信息 使用ResNet18的结构进行展示 im…

    Python 2023年9月27日
    053
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球