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)
'''