序列类型及列表推导
Python不管是哪种数据结构,字符串、列表、字节序列、数组、XML 元素,抑或是数据库查询结果,它们都共用一套丰富的操作:迭代、切片、排序,还有拼接。
内置序列类型
根据存放数据类型分类
容器序列
- list,tupel,collections.deque
- 存放不同类型的数据
- 所包含的任意类型的对象的引用
扁平序列
- str,bytes, bytearray, memoryview, array.array
- 只能容纳一种类型
- 存放的是值
- 一段连续的内存空间
根据能否被修改分类分类
可变序列(MutableSequence)
- list,bytearray,array.array,collections.deque,memoryview
不可变序列(Sequence)
- tuple,str,bytes
可变序列与不可变序列里面继承了一些一些属性和方法,同时MutableSequence是继承Sequence一些方法。具体如下图:
列表推导(list comprehension)与生成表达式(generator expression)
列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。
列表推导和可读性
- 格式: [x for x in [list]]
- 语法:Python 会忽略代码里 []、{} 和 () 中的换行,可以省略不太好看的续行符 \
- 原则:只用列表推导来创建新的列表,并且尽量保持简短。
- 作用:把一个序列或是其他可迭代类型中的元素过滤或是加工,然后再新建一个列表。
列表推导同filter和map的比较
filter 和 map 合起来能做的事情,列表推导也可以做,而且还不需要借助难以理解和阅读的 lambda 表达式。
** 生成二/高维列表 **
笛卡儿积是一个列表,列表里的元素是由输入的可迭代类型的元素对构成的元组,
可以使用如下的格式:[(color,size) for color in colors for size in sizes]
# exe-列表推导和可读性:字符串变成 Unicode 码位
# 利用for
symbols = 'abc'
codes = []
for symbol in symbols:
codes.append(ord(symbol))
codes
[97, 98, 99]
symbol = 'abc'
codes = [ord(symbol) for symbol in symbols]
codes
[97, 98, 99]
list1 = [12,3,3,3,3,3,
12,2,2,2]
[12, 3, 3, 3, 3, 3, 12, 2, 2, 2]
# exe-列表推导同filter和map的比较
symbols = '123456789ZXCV'
beyond_ascii = [ord(s) for s in symbols if ord(s) > 56]
print(beyond_ascii)
# 利用filter和lambda来过滤
beyond_ascii_filter = list(filter(lambda c: c>56,map(ord,symbols)))
print(beyond_ascii_filter)
[57, 90, 88, 67, 86]
[57, 90, 88, 67, 86]
# exe-生成二/高维列表
colors = ['black','white']
sizes=['s','m','l']
tshirts = [(color,size) for color in colors for size in sizes]
print(tshirts)
# 交换for的位置,hui
tshirts2 = [(size,color) for size in sizes
for color in colors ]
print(tshirts2)
[('black', 's'), ('black', 'm'), ('black', 'l'), ('white', 's'), ('white', 'm'), ('white', 'l')]
[('s', 'black'), ('s', 'white'), ('m', 'black'), ('m', 'white'), ('l', 'black'), ('l', 'white')]
生成器表达式
- 格式: (x for x in [list])
- 原则:生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里,能够节省内存
- 作用:初始化元组、数组或其他序列类型,要得到庞大的数据,又想让它占用空间少
# 生成器表达式
symbols = 'abc123456'
t = tuple(ord(symbol) for symbol in symbols)
print(t)
import array
arr = array.array('I',(ord(symbol) for symbol in symbols))
print(arr)
(97, 98, 99, 49, 50, 51, 52, 53, 54)
array('I', [97, 98, 99, 49, 50, 51, 52, 53, 54])
colors = ['black','white']
sizes=['s','m','l']
# 用到生成器表达式之后,内存里不会留下一个有 6 个组合的列表,因为生成器表达式会在每次 for
# 循环运行时才生成一个组合。
for tshirt in ('%s,%s' %(c,s) for c in colors for s in sizes):
print(tshirt)
black,s
black,m
black,l
white,s
white,m
white,l
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!