Python进阶02_序列类型及列表推导

序列类型及列表推导

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

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

瓦力人工智能 - 扫我吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值