序列构成的数组

序列类型

容器序列

listtuplecollections.deque等序列可以存放不同类型的数据。

扁平序列

strbytesbytearraymemoryviewarray.array等序列只能容纳一种类型。

可变序列

listbytearraymemoryviewarray.arraycollections.deque

不可变序列

tuplestr

列表

列表推导

列表推导(真的好用)是构建list的快捷方式,但劲酒虽好,不要贪杯哦!列表推导虽然好用,但是不要过度的使用,保持代码的简短,超过两行可以考虑使用for循环。

1
2
3
4
5
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [(color, size) for color in colors for size in sizes]

tshirts

生成器表达式

相较于列表推导,生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里,如果我们需要的列表很大时,用列表推导的方式不仅耗费时间还耗费内存,而生成器表达式则避免了这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys

L = [x for x in range(3000) if x % 2] //列表推导
J = (x for x in range(3000) if x % 2) //生成器表达式


countL = 0
countJ = 0

for x in L:
countL += 1

for x in J:
countJ += 1

print("countL == ",countL, " countJ == ",countJ) //可见二者的效果是一样的
print(sys.getsizeof(J), sys.getsizeof(L)) //在内存占用上二者的差距还是很大的

切片

格式:swq[start:stop:step]
内部调用__getitem__(slice(start:stop:step))方法。
切片是个好东西,但是突然发现没的说………..

序列的+*

这东西好用,但是有坑,据我所知GGH夏令营就被这个坑过,所以如果不熟悉慎用之。因为*有时并没有创建新的元素,而是增加了已有元素的引用。

1
2
3
4
5
6
7
board = [['-'] * 3 for i in range(3)]
board[1][2] = 'X'
board

weird_board = [['-'] * 3 ] * 3 //这是一个坑
weird_board[1][2] = 'X'
board

另外也可以使用sys.getsizeof(obj)来查看内存的占用,这里边有一个很有意思的事情。多改变几次数值,观察下内存的变化,你会发现一件很有意思的事情,可以猜想下为什么会有这种变化。

1
2
3
4
5
6
7
mylist = [1, 2, 3, 4, 5]
test = [mylist] * 30

mylist
test
sys.getsizeof(mylist)
sys.getsizeof(test)

排序

list.sort

就地排序,改变原序列的值并且返回None

sorted

不改变原序列的值,生成一个新的列表,可以接受任何形式的可迭代对象作为参数。

共同点:

两个可选关键字参数

  • reverse:默认值为False,如果设置为True,则被排序的序列会以降序输出。
  • key:只有一个参数的函数。这样的方式体现了一种编写API的思想,将API的功能交给调用方来确定,使得相应的API更加灵活。

查找与插入

bisect模块主要包含两个主要函数,bisectinsort,两个函数都利用二分查找算法在有序序列中查找或插入元素

1
2
3
4
bisect.bisect_left(t,x) #在T列表中查找x,若存在,返回x左侧位置
bisect.bisect_right(t,x)
bisect.insort_left(t,x) #在T列表中查找X,若存在,插入x左侧;
bisect.insort_right(t,x)

元组

元组常被称为不可变的列表,但初此之外元组还可以用于没有字段名的记录。

元组拆包

  • 元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是被可迭代对象中元素的数量必须要跟接受这些元素的元组的空档数一致,另外可以用*来忽略多余的元素,也可以使用_占位符,来忽略某几个元素。
  • 接受表达式的元组可以是嵌套式的,但接受元组的嵌套结构必须符合表达式本身的嵌套结构。

与列表的不同

除了跟增减元素相关的方法之外,元组支持列表的其他所有方法。例外是元组没有__reversed__方法,但是仍然可以使用reversed(tuple)

本文标题:序列构成的数组

文章作者:Darren

发布时间:2018年09月08日 - 15:09

最后更新:2018年09月20日 - 00:09

原始链接:http://Darren2017.github.io/2018/09/08/序列构成的数组/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。