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

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

时间:2023-03-26 13:50:59 Python

上一节(2.1数据类型)|下一节(2.3格式化)2.2容器本节讨论列表、字典和集合。概述通常,程序必须处理许多对象。股票投资组合股票价格列表这里可以使用三个主要选项:列表。有序的数据。字典。无序数据。收集。不同且无序的数据。将列表视为容器当数据的顺序很重要时使用列表。请记住,列表可以存储任何类型的对象。例如,包含元组的列表:portfolio=[('GOOG',100,490.1),('IBM',50,91.3),('CAT',150,83.44)]portfolio[0]#('GOOG',100,490.1)portfolio[2]#('CAT',150,83.44)listconstruction从头开始??构建列表。records=[]#Initialemptylist#Use.append()toaddmoreitemsrecords.append(('GOOG',100,490.10))records.append(('IBM',50,91.3))...fromfile读取记录的例子:records=[]#Initialemptylistwithopen('Data/portfolio.csv','rt')asf:next(f)#Skipheaderforlineinf:row=line.split(',')records.append((row[0],int(row[1]),float(row[2])))字典可用于快速随机查找(按键名)。例如,股票价格字典:prices={'GOOG':513.25,'CAT':87.22,'IBM':93.37,'MSFT':44.12}以下是一些简单的查找:>>>prices['IBM']93.37>>>prices['GOOG']513.25>>>字典构造从头开始??构建字典的示例:prices={}#Initialemptydict#Insertnewitemsprices['GOOG']=513.25prices['CAT']=87.22prices['IBM']=93.37从文件内容填充字典的示例:prices={}#Initialemptydictwithopen('Data/prices.csv','rt')asf:forlineinf:行=行。split(',')prices[row[0]]=float(row[1])注意:如果你在Data/prices.csv文件上尝试这个,你会发现它几乎可以工作-然而,在最后是一个空行使程序崩溃。需要想办法修改代码来解决这个问题(见习题2.6)。字典查找测试键是否存在:ifkeyind:#YESelse:#NO可以查找可能不存在的值,如果该值不存在则提供默认值。name=d.get(key,default)示例:>>>prices.get('IBM',0.0)93.37>>>prices.get('SCOX',0.0)0.0>>>Python中的组合键,几乎是值任何类型的都可以用作字典键。字典键必须是不可变类型。例如,元组:holidays={(1,1):'NewYears',(3,14):'Piday',(9,13):"Programmer'sday",}然后访问:>>>holidays[3,14]'Piday'>>>列表、集合或其他字典不能用作字典的键,因为列表和字典是可变的。集合集合是不同且无序的数据。tech_stocks={'IBM','AAPL','MSFT'}#Alternativesyntaxtech_stocks=set(['IBM','AAPL','MSFT'])集合对于成员测试很有用。>>>tech_stocksset(['AAPL','IBM','MSFT'])>>>tech_stocksTrue中的“IBM”>>>tech_stocksFalse中的“FB”>>>集合对于消除重复项也很有用。names=['IBM','AAPL','GOOG','IBM','GOOG','YHOO']unique=set(names)#unique=set(['IBM','AAPL','GOOG','YHOO'])其他集合操作:names.add('CAT')#添加一个itemnames.remove('YHOO')#删除一个items1|s2#Setunions1&s2#Setintersections1-s2#Setdifferencepracticein你在这些练习中开始构建的程序是本课程其余部分使用的主要程序之一。请在Work/report.py文件中工作。练习2.4:包含元组的列表Data/portfolio.csv文件包含投资组合中的股票列表。在练习1.30中,你编写了一个portfolio_cost(filename)函数来读取这个文件并执行一个简单的计算。代码应如下所示:#pcost.pyimportcsvdefportfolio_cost(filename):'''Computesthetotalcost(shares*price)ofaportfoliofile'''total_cost=0.0withopen(filename,'rt')asf:rows=csv.reader(f)headers=next(rows)forrowinrows:nshares=int(row[1])price=float(row[2])total_cost+=nshares*pricereturntotal_cost请使用这些使用以代码为指导,创建一个新文件report.py。在report.py文件中,定义read_portfolio(filename)函数,它会打开Data/portfolio.csv文件并将其读入包含元组的列表中。为此,您需要对上面的代码稍作修改。首先,不是定义total_cost=0,而是创建一个最初设置为空列表的变量。例如:portfolio=[]接下来,将每一行准确地存储到一个元组中(就像你在上一个练习中所做的那样),并将元组附加到列表中而不是将总成本相加。forrowinrows:holding=(row[0],int(row[1]),float(row[2]))portfolio.append(holding)最后返回得到的投资组合列表。以交互方式试验函数(提醒,为此,您首先需要在解释器中运行report.py程序)。提示:在终端执行文件时,请使用-i参数。>>>投资组合=read_portfolio('Data/portfolio.csv')>>>投资组合[('AA',100,32.2),('IBM',50,91.1),('CAT',150,83.44),('MSFT',200,51.23),('GE',95,40.37),('MSFT',50,65.1),('IBM',100,70.44)]>>>>>>投资组合[0]('AA',100,32.2)>>>portfolio[1]('IBM',50,91.1)>>>portfolio[1][1]50>>>total=0.0>>>forsinportfolio:total+=s[1]*s[2]>>>print(total)44671.15>>>创建一个与二维(2-D)数组非常相似的元组列表。例如,使用诸如portfolio[row][column](其中row和column是整数)之类的查找来访问特定的列和行。也就是说,可以使用如下语句重写最终的for循环:>>>total=0.0>>>forname,shares,priceinportfolio:total+=shares*price>>>print(total)44671.15>>>练习2.5:包含字典的列表修改练习2.4中编写的函数,以使用字典(而不是元组)表示投资组合中的股票。在字典中,使用字段名称“name”、“shares”和“price”来表示输入文件中的不同列。以与练习2.4中相同的方式试验这个新函数。>>>portfolio=read_portfolio('Data/portfolio.csv')>>>portfolio[{'name':'AA','shares':100,'price':32.2},{'name':'IBM','shares':50,'price':91.1},{'name':'CAT','shares':150,'price':83.44},{'name':'MSFT','shares':200,'price':51.23},{'name':'GE','shares':95,'price':40.37},{'name':'MSFT','shares':50,'price':65.1},{'name':'IBM','shares':100,'price':70.44}]>>>portfolio[0]{'name':'AA','shares':100,'price':32.2}>>>portfolio[1]{'name':'IBM','shares':50,'price':91.1}>>>portfolio[1]['shares']50>>>total=0.0>>>forsinportfolio:total+=s['shares']*s['price']>>>print(total)44671.15>>>这里可以看到每个条目的不同字段都是键名来访问,而不是数字类型的列号。这通常是首选,因为生成的代码以后更容易阅读。查看大型词典或列表可能会造成混淆。要使调试输出干净,请考虑使用pprint()函数。>>>frompprintimportpprint>>>pprint(portfolio)[{'name':'AA','price':32.2,'shares':100},{'name':'IBM','price':91.1,'shares':50},{'name':'CAT','price':83.44,'shares':150},{'name':'MSFT','price':51.23,'shares':200},{'name':'GE','price':40.37,'shares':95},{'name':'MSFT','price':65.1,'shares':50},{'name'':'IBM','price':70.44,'shares':100}]>>>练习2.6:使用字典作为容器在索引用于查找元素而不是数字的情况下,字典是一种方式跟踪元素非常有用的方法。在Pythonshell中,尝试使用字典:>>>prices={}>>>prices['IBM']=92.45>>>prices['MSFT']=45.12>>>prices...查看结果...>>>prices['IBM']92.45>>>prices['AAPL']...看结果...>>>'AAPL'inpricesFalse>>>Data/prices.csv文件包含股票价格的一系列行如下所示:“AA”,9.22“AXP”,24.85“BA”,44.85“BAC”,11.27“C”,3.72...编写read_prices(filename)函数将一个集合像这样的价格被读入字典,字典的键代表股票的名称,值代表股票的价格。为此,从一个空字典开始,然后像上面那样开始插入值。但是,现在正在从文件中读取值。我们将使用此数据结构快速查找具有给定名称的股票的价格。这部分需要一点技巧。首先,确保像以前一样使用csv模块——不需要在这里重新发明轮子。>>>importcsv>>>f=open('Data/prices.csv','r')>>>rows=csv.reader(f)>>>forrowinrows:print(row)['AA','9.22']['AXP','24.85']...[]>>>另一个小烦恼是Data/prices.csv文件中可能有一些空行。请注意,上面的最后一行数据是一个空列表-这意味着该行中没有数据。这可能会导致您的程序异常终止。酌情使用try和except语句来捕获这些异常。想法:使用if语句来防止坏数据不是更好吗?编写read_prices()函数后,以交互方式对其进行测试以确保其正常工作:>>>prices=read_prices('Data/prices.csv')>>>prices['IBM']106.28>>>prices['MSFT']20.89>>>练习2.7:看看是否可以通过向report.py程序添加一些损益表来退出所有工作。这些语句应采用练习2.5中存储股票名称的列表和练习2.6中存储股票价格的字典,并计算投资组合的当前值以及损益。目录|上一节(2.1数据类型)|NextSection(2.3Formatting)注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢