一个常见的任务是处理列表中的项(译注:元素)。本节介绍列表推导式,完成此任务的强大工具。
创建新列表列表推导式通过将操作应用于序列的每一个元素来创建新列表。
>>> a = [1, 2, 3, 4, 5] >>> b = [2*x for x in a ] >>> b [2, 4, 6, 8, 10] >>>再如:
>>> names = ['Elwood', 'Jake'] >>> a = [name.lower() for name in names] >>> a ['elwood', 'jake'] >>>列表推导式的一般语法是:[ <expression> for <variable_name> in <sequence> ]。
过滤也可以在列表推导式中对元素进行过滤。
>>> a = [1, -5, 4, 2, -2, 10] >>> b = [2*x for x in a if x > 0 ] >>> b [2, 8, 4, 20] >>> 用例列表推导式超级有用。例如,可以收集特定字典字段的值:
stocknames = [s['name'] for s in stocks]在序列上执行类数据库查询:
a = [s for s in stocks if s['price'] > 100 and s['shares'] > 50 ]也可以把列表推导式与序列缩减合并在一起:
cost = sum([s['shares']*s['price'] for s in stocks]) 一般语法 [ <expression> for <variable_name> in <sequence> if <condition>]上面语法的含义:
result = [] for variable_name in sequence: if condition: result.append(expression) 历史题外话列表推导式来自于数学(集合构建符号)。
a = [ x * x for x in s if x > 0 ] # Python a = { x^2 | x ∈ s, x > 0 } # Math这在其它几种语言中也实现了,虽然大部分的程序员可能已经想不起他们的数学课了。所以,可以将其视为很酷的列表快捷方式。
练习首先运行 report.py 程序,以便能够在交互模式下中加载股票投资组合。
bash % python3 -i report.py现在,在 Python 交互提示符下,输入语句以执行下述操作。这些操作对投资组合数据执行各类缩减,转换和查找。
练习 2.19:列表推导式尝试一些简单的列表推导式来熟悉语法:
>>> nums = [1,2,3,4] >>> squares = [ x * x for x in nums ] >>> squares [1, 4, 9, 16] >>> twice = [ 2 * x for x in nums if x > 2 ] >>> twice [6, 8] >>>请注意列表推导式是如何通过适当转换或过滤的数据创建一个新列表的。
练习 2.20:序列缩减使用单个 Python 语句计算投资组合的总价。
>>> portfolio = read_portfolio('Data/portfolio.csv') >>> cost = sum([ s['shares'] * s['price'] for s in portfolio ]) >>> cost 44671.15 >>>完成后,展示如何使用单个语句计算投资组合的当前值。
>>> value = sum([ s['shares'] * prices[s['name']] for s in portfolio ]) >>> value 28686.1 >>>上面的两个操作都是映射缩减的列子。列表推导式将操作映射到整个列表。
>>> [ s['shares'] * s['price'] for s in portfolio ] [3220.0000000000005, 4555.0, 12516.0, 10246.0, 3835.1499999999996, 3254.9999999999995, 7044.0] >>>然后,sum() 函数对所有结果进行缩减。
>>> sum(_) 44671.15 >>>有了这些知识,你现在就可以准备成立一家大数据创业公司了。
练习 2.21:数据查询请尝试以下各种数据查询示例。
首选是创建一个列表,存储持有 100 股以上的股票投资组合。
>>> more100 = [ s for s in portfolio if s['shares'] > 100 ] >>> more100 [{'price': 83.44, 'name': 'CAT', 'shares': 150}, {'price': 51.23, 'name': 'MSFT', 'shares': 200}] >>>持有 MSFT 和 IBM 股票的所有投资组合。
>>> msftibm = [ s for s in portfolio if s['name'] in {'MSFT','IBM'} ] >>> msftibm [{'price': 91.1, 'name': 'IBM', 'shares': 50}, {'price': 51.23, 'name': 'MSFT', 'shares': 200}, {'price': 65.1, 'name': 'MSFT', 'shares': 50}, {'price': 70.44, 'name': 'IBM', 'shares': 100}] >>>持有总价超过 $10000 的所有股票投资组合。
>>> cost10k = [ s for s in portfolio if s['shares'] * s['price'] > 10000 ] >>> cost10k [{'price': 83.44, 'name': 'CAT', 'shares': 150}, {'price': 51.23, 'name': 'MSFT', 'shares': 200}] >>> 练习 2.22:数据提取展示如何构建元组 (name, shares) 列表,名称(name )和 股数(shares)从股票投资组合(portfolio)中获取:
>>> name_shares =[ (s['name'], s['shares']) for s in portfolio ] >>> name_shares [('AA', 100), ('IBM', 50), ('CAT', 150), ('MSFT', 200), ('GE', 95), ('MSFT', 50), ('IBM', 100)] >>>如果将方括号([,])更改为花括号({, }),那么将得到集合推导式。这会得到独一无二的的或无重复的值。
例如,这将确定集合中的股票名称是独一无二的:
>>> names = { s['name'] for s in portfolio } >>> names { 'AA', 'GE', 'IBM', 'MSFT', 'CAT' } >>>如果指定键值对(key:value),则可以构建一个字典。例如,构建一个将股票名称映射到持有的股票数量的字典:
>>> holdings = { name: 0 for name in names } >>> holdings {'AA': 0, 'GE': 0, 'IBM': 0, 'MSFT': 0, 'CAT': 0} >>>