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

后面的特性就是众所皆知的字典推导式。让我们将其表格化:

>>> for s in portfolio: holdings[s['name']] += s['shares'] >>> holdings { 'AA': 100, 'GE': 95, 'IBM': 150, 'MSFT':250, 'CAT': 150 } >>>

请尝试以下示例,该示例将 prices 字典过滤出仅在 portfolio 中出现的名称(name):

>>> portfolio_prices = { name: prices[name] for name in names } >>> portfolio_prices {'AA': 9.22, 'GE': 13.48, 'IBM': 106.28, 'MSFT': 20.89, 'CAT': 35.46} >>> 练习 2.23: 从 CSV 文件提取数据

在各类数据处理中,知道如何将列表,集合,字典推导式联合使用会非常有用。这里有一个示例,展示如何从 CSV 文件中提取所选择的列。

首先,从 CSV 文件读取一行标题信息:

>>> import csv >>> 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) for colname in select ] >>> indices [0, 3, 4] >>>

最后,使用字典推导式读取数据的一行并把其转换为字典。

>>> row = next(rows) >>> record = { colname: row[index] for colname, index in zip(select, indices) } # dict-comprehension >>> record {'price': '32.20', 'name': 'AA', 'shares': '100'} >>>

如果你对前面的操作感到满意,那么请读取文件的剩余部分:

>>> portfolio = [ { colname: row[index] for colname, index in zip(select, indices) } for row in rows ] >>> 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 模块。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxszs.html