《Python Cookbook 3rd》笔记(1.19):转换并同时计算数据
生活随笔
收集整理的這篇文章主要介紹了
《Python Cookbook 3rd》笔记(1.19):转换并同时计算数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉換并同時計算數據
問題
你需要在數據序列上執行聚集函數 (比如 sum() , min() , max() ),但是首先你需要先轉換或者過濾數據。
解法
一個非常優雅的方式去結合數據計算與轉換就是使用一個生成器表達式參數。比如,如果你想計算平方和,可以像下面這樣做:
nums = [1, 2, 3, 4, 5] s = sum(x * x for x in nums)下面是更多的例子:
# Determine if any .py files exist in a directory import os files = os.listdir('dirname') if any(name.endswith('.py') for name in files):# 例子1print('There be python!') else:print('Sorry, no python.')# Output a tuple as CSV s = ('ACME', 50, 123.45) print(','.join(str(x) for x in s))# 例子2# Data reduction across fields of a data structure portfolio = [ {'name':'GOOG', 'shares': 50}, {'name':'YHOO', 'shares': 75}, {'name':'AOL', 'shares': 20}, {'name':'SCOX', 'shares': 65} ] min_shares = min(s['shares'] for s in portfolio) #例子3討論
上面的示例向你演示了當生成器表達式作為一個單獨參數傳遞給函數時候的巧妙語法 (你并不需要多加一個括號)。比如,下面這些語句是等效的:
s = sum((x * x for x in nums)) # 顯示的傳遞一個生成器表達式對象 s = sum(x * x for x in nums) # 更加優雅的實現方式,省略了括號使用一個生成器表達式作為參數會比先創建一個臨時列表更加高效和優雅。比如,如果你不使用生成器表達式的話,你可能會考慮使用下面的實現方式:
nums = [1, 2, 3, 4, 5] s = sum([x * x for x in nums])這種方式同樣可以達到想要的效果,但是它會多一個步驟,先創建一個額外的列表。對于小型列表可能沒什么關系,但是如果元素數量非常大的時候,它會創建一個巨大的僅僅被使用一次就被丟棄的臨時數據結構。而生成器方案會以迭代的方式轉換數據,因此更省內存。
在使用一些聚集函數比如 min() 和 max() 的時候你可能更加傾向于使用生成器版本,它們接受的一個 key 關鍵字參數或許對你很有幫助。比如,在上面的證券例子中,你可能會考慮下面的實現版本:
# Original: Returns 20 min_shares = min(s['shares'] for s in portfolio) # Alternative: Returns {'name': 'AOL', 'shares': 20} min_shares = min(portfolio, key=lambda s: s['shares'])總結
以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(1.19):转换并同时计算数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Python Cookbook 3rd
- 下一篇: 学点数学(4)-协方差矩阵