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

前言:本文笔记来自于《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),这样矩形的元组就发生了改变。

原文地址:https://www.cnblogs.com/Masterpaopao/p/10003671.html