標籤:

python字典如何:按值排序,在值相等的情況下再按鍵排序?

例如{『ab:2, bc:5, dc:3, bc:3}的排序應該是[(bc, 5), (bc, 3), (dc, 3), (ab, 2)], 謝謝!


首先,字典里的鍵不可重複。題主給的例子

{ab:2, bc:5, dc:3, bc:3}

中有兩個bc。python在初始化字典時用後面的把前面的覆蓋掉,從而成為:

{ab: 2, dc: 3, bc: 3}

接著回答題主問題「如何先按值再按鍵排序」:

注意:字典本身是無序的,因為在python中字典是通過hash實現的。不過可以拿出字典中的鍵值到一個列表中進行排序。

於是問題可以轉化為「如何對一個元組的列表按照兩個優先順序不同的key進行排序」。

上代碼:

In [1]: d = {ab:2, bc:5, dc:3, bc:3}
In [2]: sorted(d.items(), key=lambda kv: (-kv[1], kv[0]))
Out[1]: [(bc, 3), (dc, 3), (ab, 2)]

(根據題意感覺題主想說的是值降序排列,鍵升序排列,所以在kv[1]前加了負號。

如果想對更多的key進行排序(不只是兩個),例如對

l = [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 2, 5)]

這樣的數組,先比最後一個,再比倒數第二個,最後比第一個

只需在lambda表達式處返回相應元組即可:

In [1]: l = [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 2, 5)]
In [2]: sorted(l, key=lambda x: (x[3], x[2], x[1], x[0]))
Out[1]: [(1, 2, 3, 4), (1, 2, 2, 5), (1, 2, 3, 5)]

這樣的方式可以應對根據n個不同優先順序的key排序的情況。


#對字典進行排序

tupSum = sorted(dicSum.iteritems(), key=lambda val:val[1],reverse=True)


推薦閱讀:

TAG:Python |