序列的操作 cookbook讀書筆記

2021-08-09 08:54:44 字數 2756 閱讀 7372

如果序列上的值都是hashable 型別,那麼可以很簡單的利用集合或者生成器來解決這個問題。如果你想消除元素不可雜湊(比如dict 型別) 的序列中重複元素的話,將序列元素轉換成hashable 型別進行比較即可。

def dedupe(items, key=none):

seen = set()

for item in items:

val = item if key is none else key(item)

if val not in seen:

yield item

seen.add(val)

>>> a = [ , , , ]

>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))

[, , ]

>>> list(dedupe(a, key=lambda d: d['x']))

[, ]

你避免了大量無法理解的硬編碼下標,使得你的**更加清晰可讀。內建的slice() 函式建立了乙個切片物件,可以被用在任何切片允許使用的地方。

>>> items = [0, 1, 2, 3, 4, 5, 6]

>>> a = slice(2, 4)

>>> items[2:4]

[2, 3]

>>> items[a]

[2, 3]

>>> items[a] = [10,11]

>>> items

[0, 1, 10, 11, 4, 5, 6]

使用operator 模組的itemgetter 函式,可以非常容易的排序字典。使用operator.attrgetter()函式,可以排序類(通過其屬性)。除了排序,該技術也同樣適用於min() 和max() 等函式。

rows = [,,

,]rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))

print(rows_by_lfname)

>>> from operator import attrgetter

>>> sorted(users, key=attrgetter('user_id'))

[user(3), user(23), user(99)]

其實key=lambda也可以實現以上功能,選擇使用lambda 函式或者是attrgetter() 、itemgetter()可能取決於個人喜好。但是,attrgetter() 、itemgetter()函式通常會執行的快點,並且還能同時允許多個字段進行比較。

from operator import itemgetter

from itertools import groupby

# sort by the desired field first

rows.sort(key=itemgetter('date'))

# iterate in groups

for date, items in groupby(rows, key=itemgetter('date')):

print(date)

for i in items:

print(' ', i)

最簡單的過濾序列元素的方法就是使用列表推導([n for n in mylist if n > 0])。使用列表推導的乙個潛在缺陷就是如果輸入非常大的時候會產生乙個非常大的結果集,占用大量記憶體。如果你對記憶體比較敏感,那麼你可以使用生成器表示式迭代產生過濾的元素。有時候,過濾規則比較複雜,不能簡單的在列表推導或者生成器表示式中表達出來。比如,假設過濾的時候需要處理一些異常或者其他複雜情況。這時候你可以將過濾**放到乙個函式中,然後使用內建的filter() 函式。

values = ['1', '2', '-3', '-', '4', 'n/a', '5']

def is_int(val):

try:

x = int(val)

return true

except valueerror:

return false

ivals = list(filter(is_int, values))

print(ivals)

# outputs ['1', '2', '-3', '4', '5']

>>> from collections import namedtuple

>>> subscriber = namedtuple('subscriber', ['addr', 'joined'])

>>> sub = subscriber('[email protected]', '2012-10-19')

>>> sub

subscriber(addr='[email protected]', joined='2012-10-19')

>>> sub.addr

'[email protected]'

>>> sub.joined

'2012-10-19'

首先你需要先轉換或者過濾資料,乙個非常優雅的方式去結合資料計算與轉換就是使用乙個生成器表示式引數。

portfolio = [,,

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

檔案目錄操作 cookbook讀書筆記

使用os.path 模組中的函式來完成多數操作 使用os.path 來進行檔案測試是很簡單的。在寫這些指令碼時,可能唯一需要注意的就是你需要考慮檔案許可權的問題,特別是在獲取元資料時候 import os path users beazley data data.csv get the last c...

特殊的字典 cookbook讀書筆記

一鍵對多個值,只支援兩種多值list和set,其它操作都類似 from collections import defaultdict d defaultdict list d defaultdict s defaultdict set s a add 1 s a add 2 s b add ok s...

類與物件 cookbook讀書筆記

重新定義它的 str 和 repr 方法,使用str 或print 函式會輸出 str 字串 更適合人閱讀的字串 repr 函式返回 repr 字串 更適合機器閱讀 repr 生成的文字字串標準做法是需要讓eval repr x x 為真。如果實在不能這樣子做,應該建立乙個有用的文字表示,並使用 和...