python將字典排序
阿新 • • 發佈:2018-11-19
如果有一系列字典或物件例項,我們想根據某個特定欄位來分組迭代資料。
有一字典列表:
rows = [ {'address': '北京朝陽區金臺路', 'date': '07/01/2012'}, {'address': '北京朝陽區將臺', 'date': '07/04/2012'}, {'address': '北京海淀區上地三街', 'date': '07/21/2012'}, {'address': '河北省廊坊市廣陽區', 'date': '07/03/2012'}, {'address': '雲南省麗江市', 'date': '07/02/2012'}, {'address': '福建省泉州市', 'date': '07/01/2012'}, {'address': '上海市陸家嘴', 'date': '07/04/2012'} ]
現在根據日期以分組的方式迭代資料。首先,以目標欄位來對序列排序,然後,在使用itertools.groupby()。
from operator import itemgetter
from itertools import groupby
rows.sort(key=itemgetter('date'))
for date, items in groupby(rows, key=itemgetter('date')):
print(date)
for i in items:
print(' ', i)
輸出結果
07/01/2012 {'address': '北京朝陽區金臺路', 'date': '07/01/2012'} {'address': '福建省泉州市', 'date': '07/01/2012'} 07/02/2012 {'address': '雲南省麗江市', 'date': '07/02/2012'} 07/03/2012 {'address': '河北省廊坊市廣陽區', 'date': '07/03/2012'} 07/04/2012 {'address': '北京朝陽區將臺', 'date': '07/04/2012'} {'address': '上海市陸家嘴', 'date': '07/04/2012'} 07/21/2012 {'address': '北京海淀區上地三街', 'date': '07/21/2012'}
函式groupby()通過掃描序列找出擁有相同值(或是由引數key指定的函式所返回的值)的序列值,並將它們分組。groupby()建立了一個迭代器,而在每次迭代時都會返回一個值和一個子迭代器,這個子迭代器可以產生所有在該分組內具有該值的項。
這裡重要的是首先根據感興趣的欄位對資料進行排序。因為groupby()只能檢查持續的項,不先排序的話,將無法按所想的方式來對記錄進行排序。
也可以使用defaultdict()構建一個一鍵多值字典
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/04/2012']: print(r)
輸出結果
{'address': '北京朝陽區將臺', 'date': '07/04/2012'}
{'address': '上海市陸家嘴', 'date': '07/04/2012'}