Fork me on GitHub

数据类型之列表

一、概要

  • 列表基础
  • 列表的基本操作
  • 列表的主要方法
  • 列表的其它方法
  • 总结

二、列表的基础

列表是序列中的一种,所以所有序列的属性或者方法都适用于列表,而序列就是使用一对中括号将序列中的元素值括起来。

(一) 创建列表

列表是可迭代对象,能够进行for循环,创建形式也是多样的。

#直接通过[]进行创建
l= [1,"hello",[4,5],{"name":"zhangsan"}]
#关键字list进行创建
l2 = list([1,23,3])
l3 = [1,23,["shen","jianping"],43,566,77]
print(l2) #[1, 23, 3]
print(type(l2))#<class 'list'>

(二) 索引

列表中的所有元素都是有编号的,编号是从0开始递增,这个编号就是列表元素的索引,所有的元素都可以通过索引访问。

l=['zhangsan','lisi','wangwu']
print(l[0])#zhangsan
print(l[2])#wangwu

列表的索引和字符串的索引是一样的,也可以通过负数取值,-1代表最后一个,依次类推。

l=['zhangsan','lisi','wangwu']
print(l[-1])#wangwu
print(l[-2])#lisi

(三)分片

分片是从列表A中获取一个子列表B,从A中获取B,需要指定B在A中的开始索引以及结束索引,因此,分片操作需要指定两个索引。

l=[1,2,3,4,5,6,7]
print(l[2:5])#[3, 4, 5]
print(l[-4:-2])#[4, 5]

使用负数作为开始索引,并省略结束索引

l=[1,2,3,4,5,6,7]
print(l[-3:])#[5, 6, 7]
print(l[-3:7])#[5, 6, 7] 结尾使用了正整数作为索引

省略开始索引

l=[1,2,3,4,5,6,7]
print(l[:3])#[1, 2, 3] 获取前三个值的列表

设置步长

对列表进行分片时,默认的步长是1,即获取相邻的元素,如果获取非相邻元素,就需要指定步长了。

l=[1,2,3,4,5,6,7]
print(l[:3:2])#[1, 3]

步长可以是负数,但不可以为0,如果为负数,分片会从列表的右侧开始,所以开始的索引要大于结束的索引。

l=[1,2,3,4,5,6,7,8,9]
print(l[7:2:-2])#[8, 6, 4]

注意:

  • 分片取值左取右不取,如果步长为负数,则相反。

(四) 列表相加

列表的相加是收尾相连,并不是元素的相加。

l1=[1,2,3,4,5,6,7,8,9]
l2=['h','e','l','l','0']
print(l1+l2)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 'h', 'e', 'l', 'l', '0']

注意:列表不能和字符串这样不同类型的数据进行相加。

(五)列表的乘法

l=[1,2,3,4,5,6,7,8,9]
print(l*2)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(六) 检查某个值是否属于列表

使用in进行判断

l=[1,2,3,4,5,6,7,8,9]
print(2 in l)#True

(七)列表长度、最大值、最小值

这是三个内建函数,len()、max()、min(),用于返回列表中元素的数量、最大的元素、最小的元素。注意使用min()和max()方法时,列表中的每个元素必须是可比较。

values=[1,2,3,4,5,6,7,8,9]
print(len(values))#9
print(max(values))#9
print(min(values))#1

(八) 案例

要求输入年、月、日,并且将月转换成中文输出,如:输入的月份为4,要求输出四月。

months = [
    "一月",
    "二月"
    ...,
    "十二月"
]
year = input("年:")
month = input("月(1-12):")
day = input("日(1-31):")
monthNum = int(month)
monthName = months[monthNum-1]
res = "%s年%s月%s" % (year, monthName, day)

三、列表的基本操作

(一) 列表元素赋值

之前使用列表索引获取列表中的某个值,而修改列表中的某一个元素,使用一对中括号指定元素在列表中的索引,然后使用赋值运算符(“=”)进行赋值。

l=["hello","world"]
l[1]="bright"
print(l)#['hello', 'bright']

(二) 删除列表元素

使用del进行删除

l=["hello","world"]
del l[1]
print(l)#['hello']

(三) 分片赋值

分片赋值是将列表的某一部分通过分片获取,然后将其替换

l=["a","b","c","d","e"]
l[2:]=[1,2,3]
print(l)#['a', 'b', 1, 2, 3]

利用这个特性可以在一个列表中插入一些元素或者删除一些元素

l=["a","b","c","d","e"]
#插入元素
l[1:1]=[1,2,3,4,5]#['a', 1, 2, 3, 4, 5, 'b', 'c', 'd', 'e']
print(l)
#删除元素
l[1:3]=[]
print(l)#['a', 3, 4, 5, 'b', 'c', 'd', 'e']

(四) 案例

列表拼接:list1 = list2 = [1,2,3,4,5,6]

list1[3:] = list2[3:]

print(list1)

四、列表的主要方法

(一) append()

append 在列表最后插入新的值

l=[1,2,3]
l.append(4) #添加单个元素
print(l) #[1, 2, 3, 4]
l=[1,2,3]
l.append([4,5])#添加列表
print(l) #[1, 2, 3, [4, 5]]

(二) clear()

清除列表的内容

l=[1,2,3]
l.clear()
print(l)#[]

(三) copy()

copy后就是一个新的对象,与之前的就没有关系,修改新的列表,不会影响之前的列表。

l1=[1,2,3]
print(id(l1))#90554760
l2=l1.copy()
print(id(l2))#85322120
l3=l1
print(id(l3))#90554760

(四) count()

统计某个元素在列表中出现的次数

l=['a','b','c','a','d','a']
print(l.count('a'))#3


(五) extend()

在原列表后扩展新的列表

l1=[1,2,3]
l2=[4,5,6]
l1.extend(l2)
print(l1) #[1, 2, 3, 4, 5, 6]


使用列表连接以及分片也是可以达到这种效果的,但是效率没有这个高。

#列表连接
l1=[1,2,3]
l2=[4,5,6]
print(l1+l2)#[1, 2, 3, 4, 5, 6]

#切片
l1=[1,2,3]
l2=[4,5,6]
l1[len(l1):]=l2
print(l1)#[1, 2, 3, 4, 5, 6]


(六) index()

从列表中找出某个值第一次出项的索引值

l=['a','b','c','a','d']
print(l.index('a'))#0


如果元素不在列表中就会抛出异常

l=['a','b','c','a','d']
print(l.index('e'))

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-862cf3f75961> in <module>
      1 l=['a','b','c','a','d']
      2 print(l.index('a'))#0
----> 3 print(l.index('e'))

ValueError: 'e' is not in list


(七) insert()

用于将值插入都列表指定的位置

l=['a','b','c','a','d']
#在索引为2的地方插入值
l.insert(2,[4,5,6])#['a', 'b', [4, 5, 6], 'c', 'a', 'd']
print(l)


同样也可以使用分片赋值

l=['a','b','c','a','d']
l[2:2]=[[4,5,6]]
print(l)#['a', 'b', [4, 5, 6], 'c', 'a', 'd']


(八) pop()

用于移除列表中的元素(默认移除列表最后一个元素),并返回该元素的值

l=['a','b','c','a','d']
result=l.pop()
result1=l.pop(1)
print(result)#d 返回默认删除的最后一个元素
print(result1)# 返回指定的删除元素
print(l)#['a', 'b', 'c', 'a']


(九) remove()

用于移除列表中某个元素的的第一次匹配项

l=['a','b','c']
result=l.remove('a')
#不会返回删除的元素
print(result)#None

print(l)#['b', 'c']


remove中删除不存在的元素会抛出异常

(十) reverse()

用于将列表中的元素反向存放

l=[1,2,3,4,5,6]
#将列表元素倒序排放
l.reverse()
print(l)#[6, 5, 4, 3, 2, 1]


(十一) sort()

用于对列表进行排序,调用该方法会改变原来的列表

l=[1,4,3,6,7,2]
#对列表进行升序排列(默认方式)
l.sort()
print(l)#[1, 2, 3, 4, 6, 7]


l=[1,4,3,6,7,2]
#对列表进行降序排列,与reverse方法效果一样
l.sort(reverse=True)
print(l)#[7, 6, 4, 3, 2, 1]



使用sort排序会直接修改原列表,如果想修改其副本,可以使用以下方法:

  • 分片操作
l=[1,4,3,6,7,2]
l1=l[:]
l1.sort()
print(l)#[1, 4, 3, 6, 7, 2]
print(l1)#[1, 2, 3, 4, 6, 7]



  • sorted函数
l=[1,4,3,6,7,2]
l1=sorted(l)
print(l)#[1, 4, 3, 6, 7, 2]
print(l1)#[1, 2, 3, 4, 6, 7]



五、列表的其它方法

  • enumerate
l= [1,"hello",[4,5],{"name":"bright"}]
for i,j in enumerate(l):
    print(i,j)
-----------------------------------------------------输出索引和值----------------------------
0 1
1 hello
2 [4, 5]
3 {'name': 'bright'}

六、内存模型

画图说明:引用类型

七、案例

(一) 矩阵计算

arr1 = [
    [1,1],
    [2,3]
]

arr2 = [
    [0,1],
    [3,5]
]

arr3 = [
    [arr1[0][0]+arr2[0][0],arr1[0][1]+arr2[0][1]],
    [arr1[1][0] + arr2[1][0], arr1[1][1] + arr2[1][1]],
]

(二) copy、deepcopy

import copy

list1 = ["abc", 6, [1, 2, 3]]
list2 = list1.copy()
list3 = copy.deepcopy(list1)
print(list2)
print(list3)

list1[0] = 9
list1[2][0] = 10
print(list2)
print(list3)

### 输出 ###
['abc', 6, [1, 2, 3]]
['abc', 6, [1, 2, 3]]

['abc', 6, [10, 2, 3]]
['abc', 6, [1, 2, 3]]

八、总结

至少得需要知道增删改查:

  • 增 append、切片、insert
  • 删 remove、切片、del、clear
  • 改 索引、切片
  • 查 索引
posted @ 2023-01-19 16:54  iveBoy  阅读(2)  评论(0)    收藏  举报
TOP