(2)python 之 列表 list 详解

(1)定义

列表的长度可变,包括的内容也可变,使用[]或list来定义

a_list = [2, 3, 7, None]  创建list
tup = ('foo', 'bar', 'baz')
b_list = list(tup)  创建list
b_list
b_list[1] = 'peekaboo' 修改对应索引值
b_list  返回 ['foo', 'peekaboo', 'baz']
gen = range(10)
gen
list(gen)
(2)增减元素
增加元素
b_list.append('dwarf') 尾部添加元素
b_list
b_list.insert(1, 'red') 指定位置插入
b_list
注意:insert 计算代价较高,若从头尾插入,可用 collections.deque

减少元素
b_list.pop(2) 删除指定位置的元素
b_list
b_list.append('foo') 添加元素,从尾部
b_list
b_list.remove('foo')减少元素,先从头部
b_list

判断元素是否存在在列表 in /not in

'dwarf' in b_list

'dwarf' not in b_list

(3)合并列表 

连接:+ 或 extend

[4, None, 'foo'] + [7, 8, (2, 3)] 返回 [4, None, 'foo', 7, 8, (2, 3)] 创建新列表,耗性能
x = [4, None, 'foo'] x.extend([7, 8, (2, 3)]) 将元素添加到已有的列表,较好

 如:

everything = []

for chunk in list_of_lists:

everything.extend(chunk)  性能较好

everything = everything + chunk 耗性能

(4)排序 

4.1 sort 对列表内部的值进行排序,不会产生新对象;针对list

a = [7, 2, 5, 1, 3]
a.sort() 排序
a
b = ['saw', 'small', 'He', 'foxes', 'six']
b.sort(key=len) 传递排序值的函数,据字符串的长度排序
b

4.2 sorted产生已排序的新对象  sorted(x),接受参数

sorted(iterable, cmp=None, key=None, reverse=False)

参数说明:

  • iterable -- 可迭代对象。
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)

参考链接:Python sorted() 函数 | 菜鸟教程 (runoob.com) 

b = sorted(a) # 保留原列表

sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数

sorted(L, key=lambda x:x[1]) # 利用key

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

sorted(students, key=lambda s: s[2]) # 按年龄排序

sorted(students, key=lambda s: s[2], reverse=True) # 按降序

4.3 bisect 模块,实现了二分搜索和已排序列表的插值

import bisect
c = [1, 2, 2, 2, 3, 4, 7]
bisect.bisect(c, 2) 返回 4;返回要插入的位置
注意:list 内部是否已排序,不检验;不会报错,但结果可能是错的
bisect.bisect(c, 5) 返回 6
bisect.insort(c, 6) 指定插入的位置
c

(5)切片 对序列选取其子集  基本形式是  x[start:stop]

seq = [7, 2, 3, 7, 5, 6, 0, 1]
seq[1:5] 返回 [2, 3, 7, 5], 包头不包尾
seq[3:4] = [6, 3] 可指定位置赋值(修改)
seq  返回 [7, 2, 3, 6, 3, 5, 6, 0, 1]
seq[:5] 可省略start,即从头开始
seq[3:] 可省略stop,即是末尾结束
seq[-4:] 从尾部倒4为索引,至尾部;
seq[-6:-2] 
seq[::2] 表示每隔多少索引取list里面的值,每次索引加2
seq[::-1] 表示反转list

(6)内建序列函数 

6.1 enumerate 枚举

使用场景:

i = 0

for value in collection:

  i += 1

常见需求:需要知道集合中的值及相应的索引,故python内建了对应的函数;修改如下

for i, value in enumerate(collection)

实际使用;将值与索引绑定

some_list = ['foo', 'bar', 'baz']
mapping = {}
for i, v in enumerate(some_list):
    mapping[v] = i
mapping  返回 {'foo': 0, 'bar': 1, 'baz': 2}

6.2 sorted排序 接受参数,参照排序

sorted([7, 1, 2, 6, 0, 3, 2])
sorted('horse race')

 6.3 zip 将列表、元组或其他序列的元素配对,构成元组型的列表

seq1 = ['foo', 'bar', 'baz']
seq2 = ['one', 'two', 'three']
zipped = zip(seq1, seq2)
list(zipped) #必须转成list,否则是个对象
seq3 = [False, True]
list(zip(seq1, seq2, seq3)) #可处理任意长度的序列,但结果已最短的序列决定
zip和enumerate枚举一起使用的场景(同时遍历多个序列):
for i, (a, b) in enumerate(zip(seq1, seq2)):
    print('{0}: {1}, {2}'.format(i, a, b))
返回:
0: foo, one
1: bar, two
2: baz, three
zip拆分,将行的列表转成列的列表 zip(*x)
pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'),('Curt', 'Schilling')]
first_names, last_names = zip(*pitchers)
first_names
last_names

 6.4 reversed 倒序

list(reversed(range(10))) 
reversed是生产器,如果没有实例化(如list或for循环),并不会生产倒序列表

本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值