1.16 筛选序列中的元素
列表推导式
1 2 3 4 5
| mylist = [1,4,-5,10,-7,2,3,-1] [n for n in mylist if n > 0] ''' 输出:[1, 4, 10, 2, 3] '''
|
但缺点是如果原始数据非常大,这么做会产生一个庞大的结果。可以考虑使用生成器通过迭代的方法筛选结果。
生成器
1 2 3 4 5 6 7 8
| pos = (n for n in mylist if n > 0) print(pos) for x in pos: print(x,end=" ") ''' 输出:<generator object <genexpr> at 0x0000020FDCAD2B90> 1 4 10 2 3 '''
|
1.17 从字典中提取子集
使用字典推导式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 }
p1 = {key:value for key,value in prices.items() if value > 200} print(p1) tech_names = {'AAPL', 'IBM', 'HPQ', 'MSFT'} p2 = {key:value for key,value in prices.items() if key in tech_names} print(p2) ''' 输出:{'AAPL': 612.78, 'IBM': 205.55} {'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.2} '''
|
1.18 将名称映射到序列的元素中
问题
通过名称而非位置来访问数据,以减少结构中对位置的依赖性。
解决方案
collections.namedtuple()(命名元组)是一种工厂方法,它返回Python中标准元组类型的子类。
1 2 3 4 5 6 7 8 9
| from collections import namedtuple Stock = namedtuple('Stock', ['name', 'shares', 'price']) stock = Stock('ACME', 100, 123.45) print(stock) print(stock.name) ''' 输出:Stock(name='ACME', shares=100, price=123.45) ACME '''
|
1.19 同时对数据做转换和换算
在函数参数中使用生成器表达式。
比如求平方和。
1 2 3
| nums = [1, 2, 3, 4, 5] s = sum(x * x for x in nums) s
|
1.20 将多个映射合并为单个映射
假设有多个字典
1 2
| a = {'x': 1, 'z': 3} b = {'y': 2, 'z': 4}
|
现在假设执行查找操作,我们想检查这两个字典(例如,先在a中查找,如果没找到再去b中查找)。可以使用collections模块中的ChainMap类解决这个问题。
1 2 3 4 5 6 7 8 9 10 11
| from collections import ChainMap c = ChainMap(a,b) print(c['x']) print(c['y']) print(c['z']) ''' output: 1(from a) 2(from b) 3(from a) '''
|