数据结构之列表

一、生成列表

l = [1, 2, 3]
l = list((1, 2, 3)) # 不能是list(1, 2, 3)
l = list('string') # 结果:['s', 't', 'r', 'i', 'n', 'g']

二、增加和移除元素

2.1 增加元素

使用append方法可以将元素添加到列表的尾部:

l = [1,2,3]
l.append(4)
l # [1, 2, 3, 4]

使用insert方法可以将元素插入到指定的列表位置:

l = [1,2,3]
l.insert(1, 4) # 将4插入到索引为1的位置
l #[1, 4, 2, 3]

insert与append相比,计算代价更高。因为子序列元素不得不在内部移动为新元素提供空间。

2.2 移除元素

使用pop方法可以移除指定位置的元素:

l = list('string')
l.pop(2) # 移除索引为2的元素,即'r',同时返回'r',因此,不能用l = l.pop(2),否则l会变为'r'
l # 结果:['s', 't', 'i', 'n', 'g']

使用remove方法可以移除第一个符合要求的元素:

l = list('stringstr')
l.remove('s')
l # 结果:['t', 'r', 'i', 'n', 'g', 's', 't', 'r']

也可以使用innot in来检查一个元素是否在列表内,但与字典、集合相比,检查列表中是否包含一个值是非常缓慢的。这是因为Python在列表中进行了线性逐个扫描,而在字典和集合中Python是同时检查所有元素的(基于哈希表)

's' in list('string') # 结果:True
'f' in list('string') # 结果:False

三、联合列表

和元组类似,可以使用+号连接两个列表,但用extend方法会更高效一些:

l = [1, 2, 3]
l.extend([4, 'foo'])
l # 结果:[1, 2, 3, 4, 'foo']

四、排序

4.1 用sort升序

可以调用列表的sort方法对列表进行内部排序(无须新建一个对象):

l = [7, 2, 3, 5]
l.sort()
l # 结果:[2, 3, 5, 7]

可以传递一个二级排序key,比如通过字符串的长度进行排序:

l = ['hello', 'world', 'dog']
l.sort(key=len)
l # 结果:['dog', 'hello', 'world']

4.2 用sorted升序或降序

l = [7, 2, 3, 5]
sorted(l, reverse=True) # 降序,结果:[7, 5, 3, 2]
sorted(l) # 升序,结果:[2, 3, 5, 7]

五、切片

使用切片符号可以对大多数序列类型选取其子集,它的基本形式是将start:stop传入到索引符号[ ]中:

l = [7, 2, 3, 5, 6, 9, 4]
l[2: 5] # 结果:[3, 5, 6]

步进值step可以在第二个冒号后面使用,意思是每隔多少个数取一个值:

l = [7, 2, 3, 5, 6, 9, 4]
l[2:5:2] # 结果:[3, 6]
l[::2] # 结果:[7, 3, 6, 4]
l[::-1] # 可将列表翻转,结果:[4, 9, 6, 5, 3, 2, 7]

六、内建序列函数

6.1 enumerate

enumerate函数可以返回了(i, value)元组的序列,其中value是元素的值,i是元素的索引:

l = list('world')
mapping = {}
for i, v in enumerate(l):
    mapping[v] = i
mapping # 结果:{'w': 0, 'o': 1, 'r': 2, 'l': 3, 'd': 4}

6.2 zip

zip函数可以将列表、元组或其他序列的元素配对,新建一个元组构成的列表

seq1 = ['dog', 'cat', 'pig']
seq2 = ['smile', 'cry', 'happy']
seq3 = ['hello', 'world']
zipped = zip(seq1, seq2)
list(zipped) # 结果:[('dog', 'smile'), ('cat', 'cry'), ('pig', 'happy')]

zip可以处理任意长度的序列,它生成列表的长度由最短的序列决定:

seq1 = ['dog', 'cat', 'pig']
seq2 = ['smile', 'cry', 'happy']
seq3 = ['hello', 'world']
zipped = zip(seq1, seq2, seq3)
list(zipped) # 结果:[('dog', 'smile', 'hello'), ('cat', 'cry', 'world')]

zip还能将已配对的序列进行拆分:

names = [('taylor', 'swift'), ('coco', 'jack'), ('gauss', 'lando')]
first_names, last_names = zip(*names)
first_names # 结果:('taylor', 'coco', 'gauss')
last_names # 结果:('swift', 'jack', 'lando')

6.3 reversed

reversed函数可以将序列的元素反转排列,但reversed是一个生成器,因此在没有实例化(例如使用list函数或进行for循环)的时候,它并不会产生一个倒序的列表:

list(reversed([1,3,2])) # 结果:[2, 3, 1]

七、交集和并集

7.1 交集

a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).intersection(b,c)) # 结果为2

7.2 并集

a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).union(b,c)) # 结果为[0, 1, 2, 3, 4, 5, 6, 8, -1]

7.3 补集

a = [0,1,2,3,4]
b = [0,2,6]
c = [-1,2,5,8]
r = list(set(a).difference(b,c)) # a中有,但b和c都没有的元素,结果为[1, 3, 4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值