问题
你需要在数据序列上执行聚集函数(比如 sum()
, min()
, max()
), 但是首先你需要先转换或者过滤数据
解决方案
一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数
比如:
import os files = os.listdir("testPackage") print(files) # ['__init__.py', 'cookBook', 'secondPackage', 'cookBook.py'] 只会找testPackage 下面的一级文件夹及文件 if any(name.endswith('.py') for name in files): print('There be python!') # There be python! else: print('Sorry, no python.') s = ('ACME', 50, 123.45) print(','.join(str(x) for x in s)) # ACME,50,123.45
优点使用一个生成器表达式作为参数会比先创建一个临时列表更加高效和优雅(不需要两个括号),而不是这样做
举例一:
nums = [1, 2, 3, 4, 5] s = sum([x * x for x in nums]) print(s) # 55 # 最好的做法: nums = [1, 2, 3, 4, 5] s = sum(x * x for x in nums) print(s) # 55
举例二
portfolio = [ {'name': 'GOOG', 'shares': 50}, {'name': 'YHOO', 'shares': 75}, {'name': 'AOL', 'shares': 20}, {'name': 'SCOX', 'shares': 65} ] print((s['shares'] for s in portfolio)) # <generator object <genexpr> at 0x7fd797fb8af0> 是个生成器 min_shares = min(s['shares'] for s in portfolio) print(min_shares) # 20 # 也可以这么写 min_shares = min(portfolio, key=lambda d: d["shares"]) print(min_shares) # {'name': 'AOL', 'shares': 20}