1. 程式人生 > >python將字典排序

python將字典排序

如果有一系列字典或物件例項,我們想根據某個特定欄位來分組迭代資料。

有一字典列表:

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'}