内置的序列类型分类
这里介绍两种分类方法,
容器序列与扁平序列
容器序列:能存放不同类型的数据/ 存放对象的引用
- list
- tuple
- collections.deque
- dict (书中没说,但是个人觉得应该也算)
扁平序列:只能存放相同类型的数据 / 存值
- str
- bytes
- bytearray
- array.array
- memoryview
另一种分类方法
可变序列与不可变序列
可变序列:比如list可以放很多值,但是id(list) 不变
- list
- dict
- bytearray
- array.array
- collections.deque
- memoryview
不可变序列:比如字符串拼接之后会返回一个新的字符串对象
- str
- bytes
- tuple
列表推导和生成器表达式
列表推导式,一次性返回整个表达式生成的列表,即所有的结果
[x for x in range(4)] # [0,1,2,3]
[x for x in 'ABC'] # ['A', 'B', 'C']
生成器表达式,一次只返回所有结果中的一个,当结果数量级很大时,比如长度为1000000000的list,用生成器表达式,一次返回一个,节省内存
for x in (x for x in range(4)):
print(x)
元组和命名元组
普通元组
>>> t1=(1,2)
>>> t1
(1, 2)
命名元组
>>> from collections import namedtuple
>>> cord = namedtuple('cord','x y')
>>> cord # 构造了一个类cord
<class '__main__.cord'>
>>> type(cord)
<class 'type'>
>>> c1 = cord(1,2)
>>> c1
cord(x=1, y=2) # 打印的时候是带标签的
>>> isinstance(c1,tuple)
True # 是元组的一个子类
序列的切片
有命名的切片,避免硬编码
x = 'hello world new new day'
# x = [x for x in range(4)]
head_tow = slice(0, 2)
print(x[head_tow])
序列的 + 和 *
一般来说,python内置序列当使用了+和*后都会返回一个新的对象,下面是例子
>>> x=[1,2]
>>> y=[3,4]
>>> x+y
[1, 2, 3, 4] # 有返回说明这是一个新的对象
>>> x*2
[1, 2, 1, 2]
>>> y*2
[3, 4, 3, 4]
>>> x
[1, 2] # 实际上 x没有变化
>>> y
[3, 4]
>>>
然后是内置序列的+= 和*= ,这类似与原地操作
>>> x
[1, 2]
>>> y
[3, 4]
>>> x+=y # 无输出,表明没有返回新对象
>>> x
[1, 2, 3, 4]
>>> y
[3, 4]
>>> y*=2
>>> y
[3, 4, 3, 4] # 同理
>>>
序列的排序和插入
原地排序,新返回一个对象的排序
>>> x = [1,3,2]
>>> x.sort() # 原地排序,没有返回新的list
>>> x
[1, 2, 3]
>>> x = [1,3,2]
>>> sorted(x) # 非原地排序,返回了新的list
[1, 2, 3]
>>> x
[1, 3, 2]
bisect 二分查找和插入的使用,需要保证序列已经有序
import bisect
if __name__ == '__main__':
L = [1, 3, 3, 6, 8, 12, 15]
x = 3
x_insert_point = bisect.bisect_left(L, x) # 在L中查找x,x存在时返回x左侧的位置,x不存在返回应该插入的位置..这是3存在于列表中,返回左侧位置1
print(x_insert_point)
x_insert_point = bisect.bisect_right(L, x) # 在L中查找x,x存在时返回x右侧的位置,x不存在返回应该插入的位置..这是3存在于列表中,返回右侧位置3
print(x_insert_point)
x_insort_left = bisect.insort_left(L, x) # 将x插入到列表L中,x存在时插入在左侧
print(L)
x_insort_rigth = bisect.insort_right(L, x) # 将x插入到列表L中,x存在时插入在右侧
print(L)
######## result
1
3
[1, 3, 3, 3, 6, 8, 12, 15]
[1, 3, 3, 3, 3, 6, 8, 12, 15]