python-day4

day4-课程内容-列表【类似数组】

一、创建列表

1、创建普通列表

>>> stu = ['小王','小张','小李','小赵']
>>> stu
['小王', '小张', '小李', '小赵']

2、创建混合列表

>>> mix = ['小王','小张',3.14,[1,2,3]]
>>> mix
['小王', '小张', 3.14, [1, 2, 3]]

3、创建空列表

>>> kong = []
>>> kong
[]

二、向列表添加元素

1、append()
语法

列表.append('要添加的元素')

例如

>>> stu.append('小刘')		#在对象里面我们把属于对象的函数称之为方法,append方法属于stu列表对象的方法
>>> stu              		#所以用‘.’作用域来进行限制
['小王', '小张', '小李', '小赵', '小刘']

注意点:append()只可以一次性添加一个元素
2、extend()
语法

列表.extend([要添加的列表])

例如

>>> stu.extend(['小玉','小田'])
>>> stu
['小王', '小张', '小李', '小赵', '小刘', '小玉', '小田']

3、insert()
语法

列表.insert(要插入的下标,'要插入列表的元素')

例如

>>> stu.insert(1,'小一')
>>> stu
['小王', '小一', '小张', '小李', '小赵', '小刘', '小玉', '小田']

二、对列表中的元素进行操作

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

>>> stu = ['小王','小张','小李','小赵']
>>> stu[2]
'小李'

2、对列表内的元素进行交换

>>> temp = stu[2]
>>> stu[2] = stu[3]
>>> stu[3] = temp
>>> stu[2]
'小赵'
>>> stu[3]
'小李'

3、从列表删除元素
remove()
语法

列表.remove('要移除的元素')

例如

>>> stu.remove('小李')
>>> stu
['小王', '小张', '小赵']

注意点:若被操作删除的元素未在列表内,会报错

del #不是一个列表的方法,是一个语句
语法

del 列表名[元素下标]

例如

>>> del stu[1]
>>> stu
['小王', '小赵']

pop() #返回被剔除的元素同时将ta剔除
语法

列表名.pop(对应元素的下标,如不填则默认最后一位元素)

例如

#给他元素下标,下标即索引值
>>> stu
['小王', '小张', '小赵']
>>> stu.pop(1)
'小张'
>>> stu
['小王', '小赵']
#不给下标,下标即索引值
>>> stu
['小王', '小赵']
>>> stu.pop()
'小赵'
>>> stu
['小王']

4、列表分片 #slice
含义
利用列表分片,将新建一个列表,并可以一次性获取原列表内需要的多个元素,可以理解为:生成原列表的副本,即复制
语法

>>> stu
['小王', '小张', '小李', '小赵']
>>> stu[0:2] #默认不带最后一位
['小王', '小张']
>>> stu
['小王', '小张', '小李', '小赵']
>>> stu[:3] #前面可不给下标,即从第一个元素开始
['小王', '小张', '小李']
>>> stu[1:] #后面可不给下标,即到最后一个元素结束
['小张', '小李', '小赵']
>>> stu[] #中间必须有':'冒号,不然会报错
SyntaxError: invalid syntax
>>> stu[:] #若前后都不给下标,则会对原列表进行一个拷贝
['小王', '小张', '小李', '小赵']

三、列表的一些常用操作符

1、比较操作符

>>> list1 = [123]
>>> list2 = [456]
>>> list1 > list2
False
>>> list1 = [123,456]
>>> list2 = [234,123]
>>> list1 > list2 #只比较第0个元素的大小
False

2、逻辑操作符

>>> list3 = [123,456]
>>> (list1 < list2) and (list1 == list3)
True

3、连接操作符

>>> list4 = list1 + list2 #不要用'+'号,使用正常的append或extend进行列表元素添加
>>> list4
[123, 456, 234, 123]
>>> list1 + '小' #不可以直接添加元素,可以使用append或者extend进行元素的添加
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    list1 + '小'
TypeError: can only concatenate list (not "str") to list

4、重复操作符

>>> list4 * 3 #'*'用在列表中,即对列表中的元素可进行复制
[123, 456, 234, 123, 123, 456, 234, 123, 123, 456, 234, 123]

5、成员关系操作符【in 和 not in】

>>> 123 in list1
True
>>> 2134 in list2
False
>>> 2134 not in list2
True
# 只可判断一层关系
>>> list5 = [123,['小张','小李']]
>>> '小张' in list5
False 
# 如何对列表中的列表中的元素进行查询或返回
>>> list5[1][1]
'小李'

四、列表类型的内置函数【BIF】

1、count(要查询的元素)
计算元素在列表中出现的次数

>>> list4
[123, 456, 234, 123]
>>> list4.count(123)
2

2、index(要查询的元素)
返回参数在列表中的位置

>>> list4.index(123)
0
# index(要查找的参数,范围的起始位置,范围的终止位置)
>>> list4.index(123,3,5)
3

3、reverse()
将列表中的元素进行翻转

>>> list4.reverse()
>>> list4
[123, 234, 456, 123]

4、sort()
指定方式对列表元素进行排序,默认无参数,为从小到大排序

>>> list6 = [2,4,6,3,1,7]
>>> list6
[2, 4, 6, 3, 1, 7]
>>> list6.sort()
>>> list6
[1, 2, 3, 4, 6, 7]
# sort(func指定排序的算法,key跟算法搭配的关键字默认使用的归并排序,reverse默认=FULSE可改为TRUE)
>>> list6.sort(reverse=True)
>>> list6
[7, 6, 4, 3, 2, 1]

五、列表分片的补充

>>> list6
[7, 6, 4, 3, 2, 1]
>>> list7 = list6[:]
>>> list7
[7, 6, 4, 3, 2, 1]
>>> list8 = list6
>>> list8
[7, 6, 4, 3, 2, 1]
>>> list6.sort()
>>> list6
[1, 2, 3, 4, 6, 7]
>>> list7 #通过分片即列表拷贝的新列表不受原列表的影响,属于一个新增的独立列表
[7, 6, 4, 3, 2, 1]
>>> list8 #仅仅通过赋值的新列表,会受到原列表更改的影响,并非独立列表,只是添加了一个指向原列表的新的标签
[1, 2, 3, 4, 6, 7]

day4作业

测试题:

  1. 列表都可以存放一些什么东西?
    自答:任何数据类型
  2. 向列表增加元素有哪些方法?
    自答:append、insert、extend
  3. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?
    自答:append直接添加元素,extend用列表扩充列表
  4. member.append([‘竹林小溪’, ‘Crazy迷恋’]) 和 member.extend([‘竹林小溪’, ‘Crazy迷恋’]) 实现的效果一样吗?
    自答:不一样。前者的是将[‘竹林小溪’, ‘Crazy迷恋’]作为元素添加进去,后者是添加’竹林小溪’, 'Crazy迷恋’两个元素到member列表
  5. 有列表 name = [‘F’, ‘i’, ‘h’, ‘C’],如果小甲鱼想要在元素 ‘i’ 和 ‘h’ 之间插入元素 ‘s’,应该使用什么方法来插入?
    自答:name.insert(2,‘s’)
  6. 下边的列表分片操作会打印什么内容?
>>> list1 = [1, 3, 2, 9, 7, 8]
>>> list1[2:5]

自答:
list1 = [2,9,7]

  1. 请问 list1[0] 和 list1[0:1] 一样吗?
    自答:一样
    参考答案:不一样,list1[0] 返回第0个元素的值,list1[0:1] 返回一个只含有第0个元素的列表。
    前者是根据元素的索引值进行的查找,后者是对原列表进行的分片

  2. 如果你每次想从列表的末尾取出一个元素,并将这个元素插入到列表的最前边,你会怎么做?
    自答:reverse
    参考答案:

>>> list1.insert(0, list1.pop())
  1. 有些鱼油比较调皮,他说我想试试 list1[-3:-1] 会不会报错,怎么知道一试居然显示 [9, 7],这是怎么回事呢?
    自答:从后往前取,取从倒数第3位到倒数第2位的元素

  2. 在进行分片的时候,我们知道分片的开始和结束位置需要进行指定,但其实还有另外一个隐藏的设置:步长。
    在普通的分片操作中,步长默认设置为1,表示逐个遍历元素。其实我们可以人为调整步长以达到不可告人的秘密。

>>> list1[0:6:2]
[1, 2, 7]

那么依你推测,关于步长的知识点还有哪些(很多知识点都是通用的)?
自答:for循环或while循环中取值

  1. 课堂上小甲鱼说可以利用分片完成列表的拷贝 list2 = list1[:],那事实上可不可以直接写成 list2 = list1 更加简洁呢?
    自答:不可以,list2 = list1只是简单的将list2指向了list1并未真正生成新列表的拷贝
  2. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。
>>> 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]

自答:
del list1[1,[2]]
insert.list1(1,‘小鱿鱼’)
参考答案:

list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]
list1[1][2][0] = '小鱿鱼' 
#对列表中的元素进行修改,即对ta进行重新赋值 
  1. 要对一个列表进行顺序排序,请问使用什么方法?
    自答:列表名.sort()
    参考答案:
>>> 列表名.sort()
  1. 要对一个列表进行逆序排序,请问使用什么方法?
    自答:列表名.reverse()
    参考答案:
>>> 列表名.reverse()
>>> 列表名.sort(reverse=True)
  1. 列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧:copy() 和 clear()
    自答:
    参考答案:
    copy() 方法跟使用切片拷贝是一样的:
>>> list2 = list1.copy()
>>> list2
[1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18]

clear() 方法用于清空列表的元素,但要注意,清空完后列表仍然还在哦,只是变成一个空列表。

>>> list2.clear()
>>> list2
[]
  1. 你有听说过列表推导式或列表解析吗?明日学习下推导式和列表解析

没听过?!没关系,我们现场来学习一下吧,看表达式:

>>> [ i*i for i in range(10) ]

你觉得会打印什么内容?

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

居然分别打印了0到9各个数的平方,然后还放在列表里边了有木有?!

列表推导式(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)

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

>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2
>==0 if y%2!=0]

自答:[ (x+2 for x in range(0,9,2)),(y+2 for y in range(1,10,2))] #好吧,,理解错了
还原就是还原为最原始的for循环表达式,如果是以列表推导式展示出来,才是写对应的列表推导式

参考答案:

list1 = []
for x in range(10):
    for y in range(10):
        if x%2 == 0:
            if y%2 != 0:
                list1.append((x, y))
  1. 活学活用:请使用列表推导式补充被小甲鱼不小心涂掉的部分
    在这里插入图片描述
    自答:
	list3 =['[list2[3],':',list1[0]]',n\,'[list2[1],':',list1[1]]',n\,'[list2[2],':',list1[2]]',n\,'[list2[3],':',list1[3]]']

参考答案:

list1 = ['1.just do it','2.一切皆有可能','3.让编程改变世界','4.Impossible is Nothin']
list2 = ['4.阿迪达斯','2.李宁','3.鱼','1.耐克']

#正常形式(列表推导式还原)
for x in list1:
    for y in list2:
        if x[0] == y[0]:
            print(y,':',x[2:]) #为何要做切片,因为将list1的元素循环打印出来后为'1.just do it'等,需要将元素从.前面切掉才为需要的

#列表推导式
list3 = [(y+':'+x[2:]) for x in list1 for y in list2 if x[0] == y[0]]
# 1、为何要使用(y+':'+x[2:])的'+'号,因为需要对字符串进行拼接输出,如果使用','号,则只是将三个需要输出的元素分隔开,无法拼接输出
# 2、为何x[0] == y[0]要加上[]和索引值,因为如果单纯的是x == y则计算机会自动比较每次输出的元素是否相等,而不是比较元素的索引值

动动手:

  1. 自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好?

假设给定以下列表:

member = ['小甲鱼', '黑夜', '迷途', '怡静', '秋舞斜阳']

要求将列表修改为:

member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]

方法一:使用 insert() 和 append() 方法修改列表。

方法二:重新创建一个同名字的列表覆盖。

自答:
方法一

member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
x = ['88','90','85','90','88']
n = 0
for i in range(1,10,2):
	member.insert(i,x[n])
	n +=1
print(i)


#如果想指定打印列表中的哪个元素,可以用以下的写法
print(member[i],member[i+1])

方法二

member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
temp = member[:]
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
  1. 利用 for 循环打印上边 member 列表中的每个内容,如图:
    在这里插入图片描述
    自答:
member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
for i in member:
    print(i)
  1. 上一题打印的样式不是很好,能不能修改一下代码打印成下图的样式呢?【请至少使用两种方法实现】
    在这里插入图片描述
    自答:
    方法一
member = ['小甲鱼','黑夜','迷途','怡静','秋舞斜阳']
x = ['88','90','85','90','88']
n = 0
for i in range(1,10,2):
	member.insert(i,x[n])
	n +=1
print(member[i],member[i+1])

方法二

member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88]
x = 0
length = len(member)
while count < length:
    print(member[x],member[x+1])
    count +=2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值