【2】数据结构之列表、列表函数

列表的长度可变,内容可更改,可以使用方括号或list函数生成列表,

a_list=[2,3,7,None]
tup=('foo','bar','baz')
b_list=list(tup)
print(b_list)
['foo', 'bar', 'baz']
b_list[1]='peekaboo'
print(b_list)
['foo', 'peekaboo', 'baz']

list常用于实体化迭代器,

gen=range(10)
print(gen)
print(list(gen))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

添加和删除元素 可以使用append在列表末尾添加元素,

b_list.append('darf')
print(b_list)
['foo', 'peekaboo', 'baz', 'darf']

insert则可以在特定的位置插入元素,

b_list.insert(1,'red')
print(b_list)
['foo', 'red', 'peekaboo', 'baz', 'darf']

insert的逆运算为pop,

b_list.pop(2)
'peekaboo'
print(b_list)
['foo', 'red', 'baz', 'darf']

可以使用remove去除一个值,它会找到并去除第一个该值,

b_list.append('foo')
print(b_list)
['foo', 'red', 'baz', 'darf', 'foo']
b_list.remove('foo')
print(b_list)
['red', 'baz', 'darf', 'foo']

用in可以检查列表中是否包含某个值,

'darf' in b_list
True

否定in可以加一个not

'darf' not in b_list
False

串联和组合列表 与元组类似,可以使用+来串联两个列表,

[4,None,'foo']+[7,8,(2,3)]
[4, None, 'foo', 7, 8, (2, 3)]

可以使用extend对列表追加多个元素,

x=[4,None,'foo']
x.extend([7, 8, (2, 3)])
print(x)
[4, None, 'foo', 7, 8, (2, 3)]

需要注意的是,使用extend比使用加号要快。
排序 可以使用sort将一个列表原地排序(不创建新的对象)。

a=[7,2,5,1,3]
a.sort()
print(a)
[1, 2, 3, 5, 7]

sort函数有一些选项,如二级排序key,我们可以利用key进行排序,

b=['saw','small','He','foxes','six']
b.sort(key=len)
print(b)
['He', 'saw', 'six', 'small', 'foxes']

二分搜索和维护已排序好的列表 bisect模块支持二分查找,和向已排序的列表插入值。 bisect.bisect可以找到插入值后仍保证排序的位置,bisect.insort是向这个位置插入值,

import bisect
c=[1,2,2,2,3,4,7]
print(bisect.bisect(c,2))
print(bisect.bisect(c,5))
4
6
bisect.insort(c,6)
print(c)
[1, 2, 2, 2, 3, 4, 6, 7]

注意,bisect不会自行检查列表是否排序好。

切片
用切片操作可以选取序列的一部分数据,切片的基本形式是在方括号中使用start:stop:

seq=[7,2,3,7,5,6,0,1]
seq[1:5]
[2, 3, 7, 5]

切片也可以被序列赋值:

seq[3:4]=[6,3]
print(seq)
[7, 2, 3, 6, 3, 5, 6, 0, 1]

切片操作是“包头不包尾”。start或stop都可以被省略,省略之后,默认为序列的开头和结尾,

seq[:5]
[7, 2, 3, 6, 3]
seq[3:]
[6, 3, 5, 6, 0, 1]

负数表明从后向前切片:

seq[-4:]
[5, 6, 0, 1]
seq[-6:-2]
[6, 3, 5, 6]

在第二个冒号后使用step,可以隔一个取一个元素,

seq[::2]
[7, 3, 3, 6, 1]

一个小技巧是,在第二个冒号后使用-1,这可以将列表或元组翻转过来

seq[::-1]
[1, 0, 6, 5, 3, 6, 3, 2, 7]

序列函数
Python有一些有用的序列函数,
enumerate函数
该函数可以返回(i,value)元祖序列,

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

print(mapping)
{'foo': 0, 'bar': 1, 'baz': 2}

sorted函数
sorted函数可以从任意序列的元素返回一个新的排好序的列表,

sorted([7,1,2,6,0,3,2])
[0, 1, 2, 2, 3, 6, 7]
sorted('horse race')
[' ', 'a', 'c', 'e', 'e', 'h', 'o', 'r', 'r', 's']

zip函数
zip可以将多个列表、元组或其它序列成对组合成一个元组列表,

seq1=['foo','bar','baz']
seq2=['one','two','three']
zipped=zip(seq1,seq2)
list(zipped)
[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]

zip可以处理任意多的序列,元素的个数取决于最短的序列,

seq3=[False,True]
list(zip(seq1,seq2,seq3))
[('foo', 'one', False), ('bar', 'two', True)]

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可以被用来解压序列。也可以当作把行的列表转换为列的列表。

pitchers=[('Nolan','Ryan'),('Roger','Clements'),('Schilling','Curt')]
first_names,last_names=zip(*pitchers)
print(first_names)
print(last_names)
('Nolan', 'Roger', 'Schilling')
('Ryan', 'Clements', 'Curt')

reversed函数
reversed可以从后向前迭代一个序列,

list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list_10=list(range(10))
print(list_10[::-1])
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

需要注意的是,reversed是一个生成器,只有实体化(即列表或for循环)之后才能创建翻转的序列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值