列表,数组操作
前沿
在开发中,我们通常需要存储各种复杂的关系型数据,比如我需要存储一件商品,如果我使用字符串来插入的,会很麻烦,如下
goods = "1. 华为 6400,2. 三星 3220"
这样的字符串我们获取数据,会很麻烦,需要不断的切割,不仅麻烦,出错率还高.在python中,它跟别的语言一样,提供了列表(也就是数组)来针对该问题,它把一个对象划分了数个存储区域,来分别存储值,我们只需要按照响应的数据格式进行存储,就可以很轻易的获取/操作数据
goodArr = [1,"华为",6400]
这样的数据存储,能使得我们更轻易的获取数据,数组通过下标访问列表中的元素,下标从0开始计数列,如我要获取商品姓名,我只需要这样写
goodName = goodArr[1]
因为商品名称在数组的第二位,所以我们获取的时候应该写2,但是西方大多都是从0开始记数,所以 0 也要算一位数,既2-1,
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
定义列表/查询数据
数组名 = ["值1","值2"]
通过下标访问列表中的元素,下标从0开始计数
names = ['Alex',"Tenglan",'Eric']
>>> names[0]
'Alex'
>>> names[2]
'Eric'
>>> names[-1]
'Eric'
>>> names[-2] #还可以倒着取
'Tenglan'
一次取出多个值
>>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
>>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4
['Tenglan', 'Eric', 'Rain']
>>> names[1:-1] #取下标1至-1的值,不包括-1
['Tenglan', 'Eric', 'Rain', 'Tom']
>>> names[0:3]
['Alex', 'Tenglan', 'Eric']
>>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
['Alex', 'Tenglan', 'Eric']
>>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写
['Rain', 'Tom', 'Amy']
>>> names[3:-1] #这样-1就不会被包含了
['Rain', 'Tom']
>>> names[0::2] #后面的2是代表,每隔一个元素,就取一个
['Alex', 'Eric', 'Tom']
>>> names[::2] #和上句效果一样
['Alex', 'Eric', 'Tom']
由于python中的数组是静态的,所以可以直接添加元素_添加元素
在数组最后面添加一个元素
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新来的")
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
在指定位置插入一个数据
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(2,"强行从Eric前面插入")
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(5,"从eric后面插入试试新姿势")
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
删除元素
>>>goods = [1,"华为",64000]
# 使用下标删除
>>>del goods[1]
>>>print(goods)
[1, 64000]
#指定key 删除
>>>goods = [1,"华为",64000]
>>>goods.remove("华为")
>>>print(goods)
[1, 64000]
#删除最后一个
>>>goods.pop()
[1]
修改
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> names[2] = "该换人了"
>>> names
['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
扩展_合并数组
>>>goodsHuaWei = [1,"华为",64000]
>>>goodsXiaoMi = [2,"小米",50000]
>>>goodsHuaWei.extend(goodsXiaoMi)
>>>print(goodsHuaWei)
[1, '华为', 64000, 2, '小米', 50000]
统计
>>>goosArr = [];
>>>goodsHuaWei = [1,"华为",64000]
>>>goodsXiaoMi = [2,"小米",50000]
>>>goodsSanxing = [2,"小米",50000]
>>>goosArr.extend(goodsXiaoMi)
>>>goosArr.extend(goodsSanxing)
>>>goosArr.extend(goodsHuaWei)
#统计价格是50000的商品
>>>goosArr.count(50000)
2
排序&反转
在python2中,数组排序是可以排序不同类型的数据的,但是在3中就会报错,
>>>arr = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>>arr.sort()
TypeError: '<' not supported between instances of 'int' and 'str'
反转
#从大到小排序
>>>arr = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy']
>>>arr.sort() #从小到大排序
>>>arr.reverse(); #反转
>>>print(arr)
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex']
获取下标
根据key获取该值在数组中的下标,如果key在arr中存在多个,那就将会返回第一个key的下标
>>>arr = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy']
>>>print(arr.index("Amy"))
2
复制
默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
>>>arr = ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy']
>>>arrCopy = arr
>>>arr[1] = "zs";
>>>print(arrCopy)
['Alex', 'zs', 'Amy', 'Tom', 'Amy']
>>>print(arr)
['Alex', 'zs', 'Amy', 'Tom', 'Amy']
copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
>>> import copy
>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了
深copy,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
>>> import copy
>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']] 始终没有改变