用生成器轉換並同時計算資料

2021-08-20 13:25:28 字數 1575 閱讀 6294

你需要在資料序列上執行聚集函式(比如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):

print('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))

# data reduction across fields of a data structure

portfolio = [,,

,]min_shares = min(s['shares'] for s in portfolio)

上面的示例向你演示了當生成器表示式作為乙個單獨引數傳遞給函式時候的巧妙語法(你並不需要多加乙個括號)。 比如,下面這些語句是等效的:

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

min_shares = min(portfolio, key=lambda s: s['shares'])

00019 轉換並同時計算資料

在資料序列上執行聚集函式 比如 sum min max 但是首先你需要先轉 換或者過濾資料 生成器表示式 nums 1,2,3,4,5 print x x for x in nums at 0x00000000006e7990 s sum x x for x in nums print s impo...

python之資料序列轉換並同時計算資料

你需要在資料序列上執行聚集函式 比如sum min max 但是首先你需要先轉換或者過濾資料 乙個非常優雅的方式去結合資料計算與轉換就是使用乙個生成器表示式引數 比如 import osfiles os.listdir testpackage print files init py cookbook...

python 用生成器攜行

1.功能 實現簡單的生產消費模型 2.實現方式 通過生成器並行 攜程 實現該功能 author xuefeng import time defconsumer name print s 準備吃包子了!name while true baozi yield print 包子 s 來了,被 s 吃了!b...