欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

课时11:列表:一个打了激素的数组2

程序员文章站 2022-07-10 22:33:54
目录: 一、从列表中获取元素 二、从列表删除元素 三、列表分片 四、列表分片的进阶玩法 五、 课时11课后习题及答案 ************************** 一、从列表中获取元素 ************************** 跟数组一样,我们可以通过元素的索引值(index)从 ......

目录:

  一、从列表中获取元素

  二、从列表删除元素

  三、列表分片

  四、列表分片的进阶玩法

  五、 课时11课后习题及答案

 

**************************

一、从列表中获取元素

**************************

 跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索引值是从 0 开始的。

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name [0]
'鸡蛋'
>>> name[3]
'李狗蛋'
>>> name[1],name[3]=name[3],name[1]
>>> name
['鸡蛋', '李狗蛋', '鹅蛋', '鸭蛋']

倒数第二行语句实现了 让“李狗蛋”和“鸭蛋”的位置互调。

***********************

二、从列表删除元素

***********************

从列表中删除元素,这里介绍三种方法:remove()、del和pop().先演示下用remove()删除元素:

>>> name[1],name[3]=name[3],name[1]
>>> name
['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']
>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name.remove("李狗蛋")
>>> name
['鸡蛋', '鸭蛋', '鹅蛋']
>>> name.remove("哈哈哈")
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name.remove("哈哈哈")
ValueError: list.remove(x): x not in list

使用remove()删除元素,你并不需要知道这个元素在列表中的具体位置,只需要知道该元素存在列表中就可以了。如果要删除的元素根本不在列表中,程序就会报错。

remove()方法并不能指定删除某个位置的元素,这时要用del来实现:

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> del name[1]
>>> name
['鸡蛋', '鹅蛋', '李狗蛋']

注意:del是一个语句,不是一个列表的方法,所以你不必在它的后边加上小括号()。另外,如果你想删除整个列表,还可以直接用del加列表名删除:

>>> del name
>>> name
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    name
NameError: name 'name' is not defined

最后,演示用pop()方法“弹出”元素:

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name.pop()
'李狗蛋'
>>> name.pop()
'鹅蛋'
>>> name.pop()
'鸭蛋'
>>> name
['鸡蛋']
>>> name.pop()
'鸡蛋'
>>> name
[]

大家看到啦,pop方法()默认是弹出列表中的最后一个元素。但是这个pop()方法其实还可以灵活应用,当你为它加上一个索引值作为参数时,它会弹出这个索引值所对应的元素:

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name.pop(2)
'鹅蛋'
>>> name
['鸡蛋', '鸭蛋', '李狗蛋']

 

***************

三、列表分片

***************

利用索引值,每次我们可以从列表获取一个元素,但是我们总是贪心的,如果一次性需要获取多个元素,有没有办法实现呢?利用列表分片,我们可以简单的实现这个要求。

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name[0:2]
['鸡蛋', '鸭蛋']

这里用一个冒号隔开两个索引值,左边是开始的位置,右边是结束的位置。这里需要注意一点,结束位置上的元素是不包括的。利用列表分片,得到一个原来列表的拷贝,原来的列表并没有发生改变。 列表分片也可以简写。

>>> name = ["鸡蛋","鸭蛋","鹅蛋","李狗蛋"]
>>> name[:2]
['鸡蛋', '鸭蛋']
>>> name[0:2]
['鸡蛋', '鸭蛋']
>>> name[1:]
['鸭蛋', '鹅蛋', '李狗蛋']
>>> name[:]
['鸡蛋', '鸭蛋', '鹅蛋', '李狗蛋']

如果没有开始位置,Python会默认开始的位置是0.同样的道理,如果要得到从指定索引值到列表末尾的所有元素,把结束位置省去即可。如果没有索引值,而只是一个冒号,将得到整个列表的拷贝。 再一次强调:列表分片就是建立原列表的一个拷贝(或者说是副本),所以你想对列表做出某些修改,但同时你想保持原来那个列表,那么直接使用列表分片的方法来获取拷贝就很方便了。

 

****************************

四、列表分片的进阶玩法

****************************

分片操作实际上还可以接收第三个参数,其代表的是步长,默认情况下(不指定它的时候),该值为1。 注:例子中只有9个元素,索引值到了8.

>>> list1=[1,2,3,4,5,6,7,8,9]
>>> list1[0:9:2]
[1, 3, 5, 7, 9]

其实还可以写成list1[::2].如果步长为负数,例如-1,就相当于复制了一个反转的列表。

>>> list1=[1,2,3,4,5,6,7,8,9]
>>> list1[::2]
[1, 3, 5, 7, 9]
>>> list1[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> list1
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

********************************

五、 课时11课后习题及答案

*********************************

0.注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。

old = [1, 2, 3, 4, 5]
new = old
old = [6]
print(new)

如果不上机操作,你觉得会打印什么内容?

[1,2,3,4,5]

 

1.请问如何将下边这个列表的'小甲鱼'修改为'小鱿鱼'?

list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
>>> list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
>>> list1
[1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
>>> list1[1][2]=['小鱿鱼']
>>> list1
[1, [1, 2, ['小鱿鱼']], 3, 5, 8, 13, 18]

 

2.要对一个列表进行顺序排序,请问使用什么方法?

列表名.sort()

>>> list =[1,6,3,5,2,2,7,4]
>>> list.sort()
>>> list
[1, 2, 2, 3, 4, 5, 6, 7]

 

3.要对一个列表进行逆序排序,请问使用什么方法?

列表名.sort()

列表名.reverse()

或 列表名.sort(reverse=True)

>>> list =[1,6,3,5,2,2,7,4]
>>> list.reverse()
>>> list
[4, 7, 2, 2, 5, 3, 6, 1]
>>> list.sort()
>>> list
[1, 2, 2, 3, 4, 5, 6, 7]
>>> list.sort(reverse=True)
>>> list
[7, 6, 5, 4, 3, 2, 2, 1]

 

4.列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear() 

>>> list1 = [0,1,2,3,4]
>>> list2 = list1.copy()

>>> list2
[0, 1, 2, 3, 4]
>>> list1
[0, 1, 2, 3, 4]
>>> list1.clear()
>>> list1
[]
>>> list2
[0, 1, 2, 3, 4]

 

5.你有听说过列表推导式或列表解析吗? 

列表推导式(List comprehensions)也叫列表解析,灵感取自函数式编程语言 Haskell。Ta 是一个非常有用和灵活的工具,可以用来动态的创建列表,语法如:  

[有关A的表达式 for A in B]  

>>> list1 =[x**2 for x in range(10)]
>>> list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


>>> list1 = [] >>> for x in range(10): list1.append(x**2) >>> list1 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还原出来。

>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
>>> list1
[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9), (6, 1), (6, 3), (6, 5), (6, 7), (6, 9), (8, 1), (8, 3), (8, 5), (8, 7), (8, 9)]


>>> list = [] >>> for x in range(10): for y in range(10): if x%2 == 0: if y%2 != 0: list.append((x,y)) >>> list [(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9), (6, 1), (6, 3), (6, 5), (6, 7), (6, 9), (8, 1), (8, 3), (8, 5), (8, 7), (8, 9)]