当前位置: 首页 > 后端技术 > Python

翻译:《实用的Python编程》02_06_List_comprehension

时间:2023-03-26 13:37:13 Python

上一节(2.5集合模块)|下一节(2.7对象模型)2.6列表理解一个常见的任务是处理列表中的项目(译注:元素)。本节介绍列表理解,这是完成此任务的强大工具。创建新列表列表理解通过对序列的每个元素应用操作来创建新列表。>>>a=[1,2,3,4,5]>>>b=[2*xforxina]>>>b[2,4,6,8,10]>>>另一个例子:>>>names=['Elwood','Jake']>>>a=[name.lower()fornameinnames]>>>a['elwood','jake']>>>列表理解一般语法是:[forin]。过滤也可以过滤列表推导中的元素。>>>a=[1,-5,4,2,-2,10]>>>b=[2*xforxinaifx>0]>>>b[2,8,4,20]>>>用例列表理解非常有用。例如,您可以收集特定字典字段的值:stocknames=[s['name']forsinstocks]对序列执行类似数据库的查询:a=[sforsinstocksifs['price']>100ands['shares']>50]您还可以将列表理解与序列归约结合起来:cost=sum([s['shares']*s['price']forsinstocks])Generalsyntax[forinif]上面语法的含义:result=[]forvariable_nameinsequence:ifcondition:result.append(expression)历史题外话列表推导来源于数学(设置施工符号)。a=[x*xforxinsifx>0]#Pythona={x^2|x∈s,x>0}#Math这是用其他几种语言实现的,尽管大多数程序员可能已经忘记了他们的数学课。因此,将其视为一个很酷的列表快捷方式。练习从运行report.py程序开始,以便您可以以交互模式加载股票投资组合。bash%python3-ireport.py现在,在Python交互式提示符下,输入语句以执行下述操作。这些操作对投资组合数据执行各种缩减、转换和查找。练习2.19:列表推导尝试一些简单的列表推导来熟悉语法:>>>nums=[1,2,3,4]>>>squares=[x*xforxinnums]>>>squares[1,4,9,16]>>>twice=[2*xforxinnumsifx>2]>>>twice[6,8]>>>注意列表理解是如何被适当地转换或过滤的包含数据的新列表。练习2.20:序列归约使用单个Python语句计算投资组合的总价格。>>>portfolio=read_portfolio('Data/portfolio.csv')>>>cost=sum([s['shares']*s['price']forsinportfolio])>>>cost44671.15>>完成后,展示如何使用单个语句计算投资组合的当前价值。>>>value=sum([s['shares']*prices[s['name']]forsinportfolio])>>>value28686.1>>>以上两个操作都是映射归约的例子。列表理解将操作映射到整个列表。>>>[s['shares']*s['price']forsinportfolio][3220.0000000000005,4555.0,12516.0,10246.0,3835.1499999999996,3254.99999999999995,7044.0](>>>)>>>sum(_)44671.15>>>有了这些知识,您现在就可以开始大数据创业了。练习2.21:数据查询尝试以下各种数据查询示例。第一个选择是创建一个列表来存储持有超过100股的股票投资组合。>>>more100=[sforsinportfolioifs['shares']>100]>>>more100[{'price':83.44,'name':'CAT','shares':150},{'price':51.23,'name':'MSFT','shares':200}]>>>所有持有MSFT和IBM股票的投资组合。>>>msftibm=[sforsinportfolioifs['name']in{'MSFT','IBM'}]>>>msftibm[{'price':91.1,'name':'IBM','股份':50},{'价格':51.23,'名称':'微软','股份':200},{'价格':65.1,'名称':'微软','股份':50},{'price':70.44,'name':'IBM','shares':100}]>>>持有总价超过10000的所有股票组合。>>>cost10k=[sforsinportfolioifs['shares']*s['price']>10000]>>>cost10k[{'price':83.44,'name':'CAT','shares':150},{'price':51.23,'name':'MSFT','shares':200}]>>>练习2.22:数据提取展示了如何构建元组列表(名称、份额)、名称(name)和股票数量(shares)是从股票组合(portfolio)中获取的:>>>name_shares=[(s['name'],s['shares'])forsinportfolio]>>>name_shares[('AA',100),('IBM',50),('CAT',150),('MSFT',200),('GE',95),('MSFT',50),('IBM',100)]>>>如果把方括号([,])改成花括号({,}),那么就得到了集合推导。这会产生唯一或非重复的值。例如,这将确定集合中的股票名称是唯一的:>>>names={s['name']forsinportfolio}>>>names{'AA','GE','IBM','MSFT','CAT'}>>>如果指定键值对(key:value),就可以构建字典。例如,构建一个将股票名称映射到所持股份数量的字典:>>>holdings={name:0fornameinnames}>>>holdings{'AA':0,'GE':0,'IBM':0,'MSFT':0,'CAT':0}>>>以下特征是众所周知的字典推导式。让我们把它制表:>>>forsinportfolio:holdings[s['name']]+=s['shares']>>>holdings{'AA':100,'GE':95,'IBM':150,'MSFT':250,'CAT':150}>>>试试这个例子,它将价格字典过滤为仅出现在投资组合中的名称:>>>portfolio_prices={name:prices[name]fornameinnames}>>>portfolio_prices{'AA':9.22,'GE':13.48,'IBM':106.28,'MSFT':20.89,'CAT':35.46}>>>练习2.23:从CSV文件中提取数据数据处理,了解如何组合列表、集合和字典推导式非常有用。下面是一个示例,显示如何从CSV文件中提取选定的列。首先从CSV文件中读取一行header信息:>>>importcsv>>>f=open('Data/portfoliodate.csv')>>>rows=csv.reader(f)>>>headers=next(rows)>>>headers['name','date','time','shares','price']>>>接下来,定义一个变量来列出实际需要的列:>>>select=['name','shares','price']>>>现在,在CSV源文件中找到上述列的索引。>>>indices=[headers.index(colname)forcolnameinselect]>>>indices[0,3,4]>>>最后,使用字典理解读取一行数据并将其转换为字典。>>>row=next(rows)>>>record={colname:row[index]forcolname,indexinzip(select,indices)}#dict-comprehension>>>record{'price':'32.20','name':'AA','shares':'100'}>>>如果您对前面的操作感到满意,那么请阅读文件的其余部分:>>>portfolio=[{colname:row[index]forcolname,indexinzip(select,indices)}forrowinrows]>>>portfolio[{'price':'91.10','name':'IBM','shares':'50'},{'price':'83.44','name':'CAT','shares':'150'},{'price':'51.23','name':'MSFT','shares':'200'},{'price':'40.37','name':'GE','shares':'95'},{'price':'65.10','name':'MSFT','shares':'50'},{'price':'70.44','name':'IBM','shares':'100'}]>>>哦,天哪,read_portfolio()函数已简化为单个语句。说明列表推导式在Python中通常用作转换、过滤和收集数据的有效方法。出于语法原因,请不要过分——您应该使每个列表的理解尽可能简单。可以将事情分解成步骤。例如,不清楚您是否会将最后一个例子强加给毫无戒心的同事。也就是说,了解如何快速处理数据是一项非常有用的技能。在许多情况下,可能需要解决某种一次性问题,包括数据导入、导出、提取等。成为列表理解的高手可以大大减少设计解决方案所花费的时间。另外,不要忘记collections模块。名录|上一节(2.5集合模块)|下一节(2.7对象模型)注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢