日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组

發布時間:2023/12/13 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通過某個字段將記錄分組

問題

你有一個字典或者實例的序列,然后你想根據某個特定的字段比如 date 來分組迭代訪問。

解法

itertools.groupby() 函數對于這樣的數據分組操作非常實用。為了演示,假設你已經有了下列的字典列表:

rows = [{'address': '5412 N CLARK', 'date': '07/01/2012'},{'address': '5148 N CLARK', 'date': '07/04/2012'},{'address': '5800 E 58TH', 'date': '07/02/2012'},{'address': '2122 N CLARK', 'date': '07/03/2012'},{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},{'address': '1060 W ADDISON', 'date': '07/02/2012'},{'address': '4801 N BROADWAY', 'date': '07/01/2012'},{'address': '1039 W GRANVILLE', 'date': '07/04/2012'}, ]

現在假設你想在按 date 分組后的數據塊上進行迭代。為了這樣做,你首先需要按照指定的字段 (這里就是 date ) 排序(排序是必須的),然后調用 itertools.groupby() 函數:

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)

運行結果:

07/01/2012{'date': '07/01/2012', 'address': '5412 N CLARK'}{'date': '07/01/2012', 'address': '4801 N BROADWAY'} 07/02/2012{'date': '07/02/2012', 'address': '5800 E 58TH'}{'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}{'date': '07/02/2012', 'address': '1060 W ADDISON'} 07/03/2012 {'date': '07/03/2012', 'address': '2122 N CLARK'} 07/04/2012{'date': '07/04/2012', 'address': '5148 N CLARK'}{'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

討論

groupby() 函數掃描整個序列并且查找連續相同值 (或者根據指定 key 函數返回值相同) 的元素序列。在每次迭代的時候,它會返回一個值和一個迭代器對象,這個迭代器對象可以生成元素值全部等于上面那個值的組中所有對象。

一個非常重要的準備步驟是要根據指定的字段將數據排序。因為 groupby() 僅僅檢查連續的元素,如果事先并沒有排序完成的話,分組函數將得不到想要的結果。

如果你僅僅只是想根據 date 字段將數據分組到一個大的數據結構中去,并且允許
隨機訪問,那么你最好使用 defaultdict() 來構建一個多值字典,關于多值字典已經
在 1.6 小節有過詳細的介紹。比如:

from collections import defaultdict rows_by_date = defaultdict(list) for row in rows:rows_by_date[row['date']].append(row)

這樣的話你可以很輕松的就能對每個指定日期訪問對應的記錄:

>>> for r in rows_by_date['07/01/2012']: ... print(r) ... {'date': '07/01/2012', 'address': '5412 N CLARK'} {'date': '07/01/2012', 'address': '4801 N BROADWAY'} >>>

在上面這個例子中,我們沒有必要先將記錄排序。因此,如果對內存占用不是很關心,這種方式會比先排序然后再通過 groupby() 函數迭代的方式運行得快一些。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(1.15):通过某个字段将记录分组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。