Python - 列表

列表在Python中是一个任意类型对象位置的相关有序集合,它没有固定大小,根据数据量的不同可以动态变化。可以对列表中的数据进行赋值、修改、添加、删除等操作,可以对列表进行索引、切片、分割等操作。 

Python中创建一个列表时,解释器会在内存中创建一个堆栈自下而上堆放数据项,类似于其他编程语言中的数组。
列表可以从左向右进行索引,索引号默认从’0’开始,列表也可以从右向左进行索引,最右侧索引号尾’-1’,不要忘记’-‘,这表明了列表的索引方向

lists = ["m1", 1900, "m2", 2000, "m3", 2100]
print(lists[1])
print(lists[-2])

运行结果:

1900
m3

列表的内存利用

当创建N个元素的List时,Python的动态内存分配长N+1个元素的内存,第一个元素存储列表长度,和列表的元信息。

append一个元素时,Python将创建一个足够大的列表,来容纳原有的N个元素和将要被追加的元素。重新创建的列表长度大于N+1(虽然我们只触发一次append操作),实际上,为了未来的append操作,M个元素长度(M>N+1)的内存将会被额外分配,然后,旧列表中的数据被copy到新列表中,旧列表销毁。

注:额外内存的分配只会发生在第一次append操作时,当我们创建普通列表时,不会额外分配内存。一个append操作很可能是很多append操作的开始,通过额外分配内存来减少可能的内存分配和内存copy的次数

列表的基本操作

定义列表

lists = ["m1", 1900, "m2", 2000, "m3", 2100]

1 列表无类型标识符

2 不同类型元素可以同时出现在列表中,列表中的元素可以是数,字符串,元组,甚至是列表

3 列表以[]作为开始和结束

4 列表结束后没有;

5 列表属于序列数据结构

6 列表是可变数据对象

注:元组一旦定义完成,其中的元素不能作任何修改,也不能添加,而列表是可以更改的

7 列表并不真正存放数据,而是存放对象引用

打印列表

lists = ["m1", ["m1", 1900, "m2"], "m2", 2000, "m3", 2100]
print(lists)
print(lists[1])
print(lists[1][1])

运行结果:

['m1', ['m1', 1900, 'm2'], 'm2', 2000, 'm3', 2100]
['m1', 1900, 'm2']
1900

添加操作

* 在列表末尾追加数据项

lists.append("m4")
print(lists)

* 在列表指定位置添加数据项

insert 方法将一个对象插入到现有列表中指定索引值的前面

lists = ["m1", 1900, "m2", 2000, "m3", 2100]
lists.insert(0, 1800)
print(lists)

运行结果:

[1800, 'm1', 1900, 'm2', 2000, 'm3', 2100]

* 在列表末尾追加数据列表

extend方法接收第二个列表,将其中的各个对象增加到现有列表

lists = ["m1", 1900, "m2", 2000, "m3", 2100]
appe = ["m4", 2200, "m5", 2300]
lists.extend(appe)
print(lists)
lists.extend(["m4", 2200, "m5", 2300])
print(lists)

运行结果:

['m1', 1900, 'm2', 2000, 'm3', 2100, 'm4', 2200, 'm5', 2300]
['m1', 1900, 'm2', 2000, 'm3', 2100, 'm4', 2200, 'm5', 2300, 'm4', 2200, 'm5', 2300]

删除操作

* 删除指定索引的数据项

1 pop()根据对象的索引值从现有列表删除并返回该对象

2 如果列表为空或删除一个不存在的元素会报错IndexError

注:如果调用pop时没有指定索引值,将删除和返回列表中的最后一个对象

lists = ['m1', 1900, "m2", 2000, "m1"]
lists.pop(2)
print(lists)

运行结果:

['m1', 1900, 2000, 'm1']

* 删除指定数据项

1 若有多项匹配该指定数据项值 仅删除其中第一项(同时列表的大小减一

2 若不存在该值 报错ValueError

lists = ["m1", 1900, "m2", 2000, "m3", 2100, "m4", 2200, "m4"]
lists.remove("m4")
print(lists)

运行结果:

['m1', 1900, 'm2', 2000, 'm3', 2100, 2200, 'm4', 2300, 'm4', 2400, 'm4']

查询操作

* 查询指定数据项出现次数

如果改元素不存在,那么返回0

lists = ['m1', 1900, "m2", 2000, "m1"]
print(lists.count('m1'))

运行结果:

2

* 查询指定数据项的索引值

1 若有多项匹配该指定数据项值 仅返回第一项的索引值

2 若不存在该值 报错ValueError

lists = ['m1', 1900, "m2", 2000, "m1"]
print(lists.index('m1'))

其它操作

* 获取列表长度

若访问列表项越界,会报IndexError错误

print(len(lists))

* 反转列表

lists = ['m1', 1900, "m2", 2000, "m1"]
lists.reverse()
print(lists)

运行结果:

['m1', 2000, 'm2', 1900, 'm1']

* 列表排序

list.sort()排序时,列表内的数据项必须为同类型,默认升序排序

list.sort(reverse=True) 表示降序排列

lists = [['m1'], ["m2"], ["m1"]]
lists.sort()
print(lists)
lists = [1, 3, 2]
lists.sort()
print(lists)
lists.sort(reverse=True)
print(lists)

运行结果:

[['m1'], ['m1'], ['m2']]
[1, 2, 3]
[3, 2, 1]

* 查找最大/最小数据项

lists = [['m1', 'm3'], ['m1', "m2"], ['m2', "m1"]]
print(max(lists))
print(min(lists))

运行结果:

['m2', 'm1']
['m1', 'm2']

* 打印数据项对应的下标

lists = [['m1', 'm3', 'm3'], 1900, 'happy']
for i, val in enumerate(lists):
    print(i, val)

运行结果:

0 ['m1', 'm3', 'm3']
1 1900
2 happy

列表切片

Python中符合序列的有序序列都支持切片,如列表,字符串,元组。

格式:[start:end:step]

start:表示起始索引,从0开始,-1表示结束;若缺省起始索引,表示从头开始取

end:表示结束索引,但不包含结束索引;若缺省结束索引,则表示取到末尾

step:表示步长步长为正时,从左向右取值步长为负时,反向取值

注:如果起始索引和结束索引全部缺省,取全部

lists = [['m1', 'm3', 'm3'], 1900, 'happy', 2000,'sad', 2001]
print(lists[1:3])
print(lists[:3])
print(lists[2:])
print(lists[:])
print(lists[1:4:2])
print(lists[4:1:-2])

运行结果:

[1900, 'happy']
[['m1', 'm3', 'm3'], 1900, 'happy']
['happy', 2000, 'sad', 2001]
[['m1', 'm3', 'm3'], 1900, 'happy', 2000, 'sad', 2001]
[1900, 2000]
['sad', 'happy']

复制列表

* 浅拷贝

方法一:

sample = ['m1', 'm3', 'm3']
lists = [sample, 1900, 2001]
listscopy = lists.copy()
print(listscopy)
sample[0] = 'm0'
print(listscopy)

运行结果:

[['m1', 'm3', 'm3'], 1900, 2001]
[['m0', 'm3', 'm3'], 1900, 2001]

方法二:

import copy

sample = ['m1', 'm3', 'm3']
lists = [sample, 1900, 2001]
listcopy = copy.copy(lists)
print(listcopy)
sample[0] = 'm0'
print(listcopy)

运行结果:

[['m1', 'm3', 'm3'], 1900, 2001]
[['m0', 'm3', 'm3'], 1900, 2001]

* 深拷贝

innerobject = ['b1', 'b2']
sample = [innerobject, 'm3', 'm3']
lists = [sample, 1900, 2001]
listcopy = copy.deepcopy(lists)
print(listcopy)
innerobject[0] = 'm0'
print(listcopy)

运行结果:

[['m1', 'm3', 'm3'], 1900, 2001]
[['m1', 'm3', 'm3'], 1900, 2001]

遍历列表

Python - 遍历列表


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值