• 扎实基础深入篇(二):列表与列表的操作


    前言:本文笔记来自于《python编程从入门到实践》,Eric Mathhes著。

    代码改变世界。

    列表是什么?就是list,也就是 [ ] 。

    现在我要创建一个列表,aa=['apple' , 'orange', 'banana']

    访问列表元素的操作叫做索引,从0而不是从1开始。

    aa[0],索引第一个元素,结果是apple。

    其实还可以aa[0].title(),结果是Apple。

    当你不知道列表有多少个元素,但想访问倒数第一个元素的时候:aa[-1]

    修改列表元素,我想修改第一个元素的值变成boom。

    aa[0]=boom为错误操作,要时刻弄清楚列表里面的元素是什么形态的,是单或双引号。否则会报错boom未被定义。

    所以应该正确输入aa[0]=’boom‘

    这时候列表aa就成了

    aa=['boom' , 'orange', 'banana']

    给列表添加元素,最简单的方式自然是将元素附加到列表末尾。比如刚才把apple修改成boom,我后悔了,我想追回来:

    aa.append(’apple‘)

    这时候列表aa就是['boom', 'orange', 'banana', 'apple']。

    添加元素最简单的操作,就是append(),括号内填写想要加进去的元素。

    这个时候,有些人可能有强迫症,或者他最喜爱的水果是pitaya(火龙果),想把pitaya排在第一个,但append()只能插入到最后一个元素,这个操作就是insert()。

    aa.insert(0,’pitaya‘)    这个insert()使用的方法自然是括号内填写想要插入的索引位置,逗号后面接想要添加的元素。

    这时候他女朋友有意见了,他女朋友想要添加一个pear(梨子)进去,这个时候你会使点坏,你将梨子安排进列表中的第三个位置:

    aa.insert(2,'pear')  那么最终列表aa就是这样的结果:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple'] 

    最后再啰嗦一句,为啥括号里面是2,因为索引是从0开始的而不是1。

    然后,烦人的女朋友终于走了,其实你是非常不喜欢梨子的,这时候,你想删掉梨子,而且你明确知道梨子的位置。那么:

    del aa[2]

    print(aa)

    这时候你看到的输出结果就成了aa=['pitaya', 'boom', 'orange', 'banana', 'apple']。

    梨子成功地从列表消失了,但是,这个操作有风险,因为一经删除,你就无法再访问你删掉的东西了。

    这个时候,你的脑海中浮现出女朋友再次推门进来,看到一脸慌张的你,命令你再看看aa的情况。这个时候你是无解的。

    所以,你吓的撤回了删除的操作,这个时候aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']。

    骚年,不要慌,我有一个妙计,既可以让你的列表中没有烦人的pear,还能访问已经删除的pear,向你女朋友解释她的pear其实还在。

    pop()方法可以删除列表末尾的元素,并能让你能够接着使用它,比如,你可能需要获取刚被射杀的外星人的相关信息,然后在它死亡的位置打上死亡爆炸的特效。

    注意,为什么说pop()是删除列表末尾的元素,因为空格里面没有东西的话,是默认删除最后一个元素。

    通俗一点介绍,就是弹出元素。这时候我们知道pear的索引位置,将pear给弹出来。

    bb=aa.pop(2)    #我们将弹出去的pear存储到变量bb里面。

    print(aa)

    ptint(bb)

    输出结果为:

    ['pitaya', 'boom', 'orange', 'banana', 'apple']

    pear

    这么看来,骚年,当你女朋友要求看看你的aa列表的时候,你可以帅气地甩头发对她说:"亲爱的,我把你的pear存储在别的地方了,是一个叫baby的地方,我把它缩写成bb了。”这时候你熟练地print(bb),这时候你女朋友看到她的pear被单独的放在一个“baby”的地方,肯定感动地稀里哗啦的。

    一波骚操作,深藏功与名。

    回到正题,有的同学就有可能想起第一篇的内容,没错,就是那个删除空白的strip(),为什么使用strip()操作却不影响变量的值呢,而pop()操作不需要经过特意赋值的操作,就能直接

    影响aa列表的值呢?坦白地说,我也不知道这是什么回事,你只需要记住strip()不会影响变量的值,需要经过t特意的赋值。记就完事了。

    实际上,在我们编程的过程中,并不是每次的列表你都能记住某个元素的具体位置的,有些列表很长。你想删除一个元素但不清楚具体的索引位置。remove()可以满足这个操作。

    我们将cc设置为一个无穷元素的列表吧:cc=[……,’pear‘,……],想要弹出pear,还是将pear存储到变量bb吧:

    bb=cc.remove(’pear‘)

    这个时候,你会发现打印出来的结果不对,没错,打印的结果是None,空值。但是cc列表中确实没了pear。

    我们犯了一个思维惯性的错误,以为remove()与pop()应该一样,弹出去的值都可以访问。实际上remove()的操作同样是删除出去后,不能再访问。但是区别于del删除的操作是什么呢?

    在remove()之前,我们可以先找一个变量存储一下要删除的这个值啊。

    这个时候我们可以刹车一下,总结一下我们学到的三个删除指令:

    def aa[ ]:需要知道元素的具体索引位置,删除的值无法在访问。

    aa.pop( ):需要知道元素的具体索引位置,不输入则默认最后一个,可以访问弹出的元素,能直接影响变量的值。

    aa.remove( ):不知道元素的具体索引位置,  括号内输入要删除的元素值,删除的值无法访问,但是在操作之前能提前存储好删除的值。

    从此,我们可以推理出,def删除的操作,其实也能提前存储好要删除元素的值。故remove()和def的区别就是,前者可以直接删除,在不知道具体索引位置的情况下使用。

    那么写一段代码放在这儿,打印结果省略。

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    bb='banana'

    del aa[4]

    print(aa)

    print(bb)

    那么,大家不介意我出个简单的题吧?现有aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple'],你需要对列表中的每个水果发出我要吃这个水果的语句。

    答案:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    for a in aa:

         print("I want to ear”+a+“.”)

    输出结果:

    I want to ear pitaya.
    I want to ear boom.
    I want to ear pear.
    I want to ear orange.
    I want to ear banana.
    I want to ear apple.

    这段代码,就是对列表的遍历操作,使用的功能是for循环。

    刚开始使用for循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,不管列表中含有多少个元素。

    另外,编写for循环时,对于用于存储列表中每个值的临时变量,可以指定任何名称,还可以效率更高地这样命名,对于小猫列表一般这样:

    for cat in cats:

    如果想要执行更多的操作,想在每一次表达想吃这个水果之后,并说“吃到了,舒服!”:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    for a in aa:

        print("I want to ear”+a+“.”)

        print(“吃到了,舒服!”)

    这儿就省略掉输出结果,有些人可能就觉得很啰嗦,其实只要在结尾的时候说一句就够了。但是有人会这么敲代码,会意外地发现为啥每一句之后都有这句话,这就涉及到缩进问题。

    正确的代码应该是:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    for a in aa:

         print("I want to ear”+a+“.”)

    print(“吃到了,舒服!”)

    将最后一行取消了缩进,最后的结果变成了在最后只说了一句“吃到了,真舒服!”。

    这是因为,如果最后一行保持跟倒数第二行一样的缩进,代码就会执行为for循环里面的打印,每循环一次就会打印一次。这就是缩进块的概念。

    保持一样的缩进块,就相当于属于一个模块;不一样的缩进块,就不属于一个模块。

    当然,有人也会犯这样的错误,必要的缩进没有缩进:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    for a in aa:

    print("I want to ear”+a+“.”)

    这个时候就会报错,报的是缩进错误。当然了,不必要的缩进也会带来报错。

    可以说:强制缩进规范是python函数的特点,为了使python代码看上去整齐美观简洁。这里,我将列举出一些常犯的错误。

    1.忘记缩进。

    2.忘记缩进额外的代码行。

    3.循环后不必要的缩进。

    4.不必要的缩进。

    5.遗漏了冒号

    接下来我介绍的是使用函数range()创建数字列表。

    for value in range(1,5):

        print(value)

    输出结果:

    1

    2

    3

    4

    那么,看到这个应该有了一个大概的了解,我做出总结:range(x,y),从x开始(包含x)遍历,访问到y停止,但不会打印y。

    所以想要打印1到5,正确的方式应该是:

    for value in range(1,6):

        print(value)

    那么打印出1-10内的偶数:

    double_numble=list(range(2,11,2))  为什么从2开始,是因为前者能被打印出来;为什么是11结束,因为后者不被打印。前面两个是起点和终点,最后面的是间隔的数,打印出偶数。

    使用range()几乎能创建任何需要的数字集。那么,如何创建一个列表,其中包含前10个整数的平方呢?

    squares=[ ]

    for value in range(1,11):

        square=value**2

        squares.append(aquare)

    print(squares)

    这是一个常规的操作,先创建一个空列表,然后把1-10进行平方处理,最后append依次加入空列表。

    为了让代码更加简洁,可以这样:

    squares=[ ]

    for value in range(1,11):

        squares.append(value**2)

    print(squares)

    那么,有人可能想起上面所学的list:  double_numble=list(range(2,11,2)), 于是我也大胆尝试一下新的方法:

    for value in range(1,11):

        square=value**2

    print(list(square))

    令人意外的是,这段程序报错了,报错的原因我翻译了一下,竟然是int不能直接列表化?也就是说square是一个整数,而不是一个列表?

    于是我去运行:

    for value in range(1,11):

        square=value**2

    print(square)

    结果出乎我的意料,是100,即10的平方。不对呀,在我的思维中,这个循环的运行,square难道不是1,4,9,16,25,36,49,64,81,100吗?然后最后一行list列表括起来?

    很遗憾,事实就是这样,我的思维发生了错误。很显然,这是for循环,但是square是被循环改变了10次的值,最后一次改变的值是100,并不是我想象中的10个square值。

    有时候,错误也值得记录下来,要知道有一段诗:

    我搜集我的错误,

    不是为了把它置于枕下,

    而是为了把它洒落在路上:

    错误,也会发光。

    所以,更加简洁的表达方式就是列表解析,上面代码可以缩成两行:

    squares=[value**2 for value in range(1,11)]

    print(squares)

    可能会有些看不懂,把它们拆分成三部分,试图去理解吧!

    value**2  //  for value   //   in range(1,11)

    最后用列表括起来,就完成了!

    注:要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表,你会发现这样做完全值得。

    这儿,我会布置三道题,答案在下一篇文章公布:

    创建一个列表,其中包含3-30内能被3整除的数字。

    创建一个列表,其中包含1-10中奇数的立方数

    创建一个列表,其中包含1-20的奇数。

    (建议普通方式,列表解析方式都做一遍)

    使用列表的一部分,这个操作呢,就叫做切片。,让我们重新召唤出来aa列表:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    接下来我会做出一系列的切片操作,请自行理解。

    aa[0:3]              ['pitaya', 'boom', 'pear']

    aa[1:4]              ['boom', 'pear', 'orange']

    aa[ :4]               ['pitaya', 'boom', 'pear', 'orange']

    aa[2: ]               ['pear', 'orange', 'banana', 'apple']

    aa[-3: ]              ['orange', 'banana', 'apple']

    如果我想要进行切片操作后进行遍历,比如我想打印出前三个水果并表达想吃的愿望:

    for a in aa[ : 3]:

        print("I want to eat "+a +".")

    输出的结果自然是:

    I want to eat pitaya.
    I want to eat boom.
    I want to eat pear.

    要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([ : ])。

    让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    bb=aa[ : ]

    print(aa)

    print(bb)

    结果很明显,是一样的列表。但是,我就知道有人要问,为什么第二行不能直接bb=aa赋值处理呢?

    是这样的,你可以先运行这段代码:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    bb=aa

    bb.append(’ice‘)

    print(aa)

    print(bb)

    有没有发现这段代码的运行结果跟你想象中的不一样?为什么你给bb加一个’ice‘,为什么aa列表也加进去了?

    因为,你如果按上面的方式处理的话,直接赋值处理,你会将变量aa和变量bb都指向了一个列表。所以你如果修改了aa的值,bb的值也会相应的变化。

    正确的操作应该是产生出一个独立的列表,这样两个列表的变化是独立的。所以正确的方式是:

    aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']

    bb=aa[ : ]

    bb.append(’ice‘)

    print(aa)

    print(bb)

    输出结果:

    ['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
    ['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple', 'ice']

    学了这么多,有人就会考虑到一些项目中的需求,想要弄一个集合,里面的元素值不能被修改,确实有,这个概念就是元组,用()表示。

    假如要定义一个长宽不应改变的矩形,可以将长度和宽度存储在一个元组中。

    dimensions=(20,50)

    具有无法修改里面元素的性质,否则代码会报错。同时这个元组跟列表一样,可以遍历for循环操作。

    所以能修改的只有元组的变量,给存储元组的变量赋值。

    dimensions=(30,40),这样矩形的元组就发生了改变。

  • 相关阅读:
    Gym 100818F Irrational Roots (数学)
    学习总结 for循环--冒泡排序
    学习总结 for循环语句的应用
    学习总结 条件语句的应用
    学习总结 运算符了解与应用
    学习记录 彻底搞清 C#中a++与++a的区别
    学习总结 数据类型的应用与转换
    学习总结 数据类型
    学习总结 二进制转换与应用
    学习总结 vs软件简单了解
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10003671.html
Copyright © 2020-2023  润新知