1. 程式人生 > 其它 >python 對字典、列表進行排序

python 對字典、列表進行排序

對列表進行排序

if __name__ == "__main__":
    arr = [2, 5, 7, 5, 3, 22, 551, 11]
    # 對數值列表進行從小到大排序
    arr.sort()
    # 然後進行反轉 為從大到小
    arr.reverse()
    # 這都是操作的原列表,不會產生新的列表,即不會額外消耗記憶體
    print(arr)
    # 使用sorted函式,會產生一個新列表
    b = sorted(arr)
    print(b)
[551, 22, 11, 7, 5, 5, 3, 2]
[2, 3, 5, 5, 7, 11, 22, 551]

Dictionary 是一種重要的資料結構,它通過將 key 與 value 進行對映來儲存資料。Python 中的預設字典是無序資料結構。與列表一樣,我們可以使用 sorted()函式按鍵對字典進行排序。但是,它只返回一個根據 key 排序的列表,這通常不是我們所希望的。我們可能希望它按 value 而不是按 key 進行排序,或者我們可能希望它返回一個已排序的字典而不是一個列表。在本文中,我們討論兩種簡單的方法,我們可以使用這兩種方法對 Python 字典進行排序,並返回所希望的結果

整理一個列表

既然我們在討論排序,我想首先指出這兩個排序函式之間的一個非常重要的區別。讓我們來看看列表之間的區別。假設我們有兩個列表:

if __name__ == "__main__":
    num = [2, 5, 6, 1, 4, 3]
    lett = ['b', 'c', 'd', 'f', 'a', 'e']

我們有兩種對列表進行排序的方法,一種是使用 sort()進行 in-place 排序,另一種是使用 sorted() ,這不是 in-place 排序。不同之處在於,當使用 sort()時,您將更改原始列表,而 sorted()將返回一個新列表,而不更改原始列表。如下所示:

if __name__ == "__main__":
    num = [2, 5, 6, 1, 4, 3]
    lett = ['b', 'c', 'd', 'f', 'a', 'e']
    num.sort()
    print(num) #[1, 2, 3, 4, 5, 6]

if __name__ == "__main__":
    num = [2, 5, 6, 1, 4, 3]
    lett = ['b', 'c', 'd', 'f', 'a', 'e']
    # num.sort()
    print(sorted(num))  # [1, 2, 3, 4, 5, 6]
    print(num)  # [2, 5, 6, 1, 4, 3]

選用哪一種取決於實際情況。例如,如果您想保留原始記錄,那麼您應該使用 sorted()。如果希望節省空間和記憶體,那麼應該使用 sort()。

整理一個字典

if __name__ == "__main__":
    num = [2, 5, 6, 1, 4, 3]
    lett = ['b', 'c', 'd', 'f', 'a', 'e']
    dic = dict(zip(lett, num))
    print(dic)
    print(sorted((dic)))
    print(sorted(dic.values()))

在這裡使用zip函式非常方便,我們將兩個長度相同的列表中的元素對映到一起。
為了對字典進行排序,我們必須使用sorted(),因為字典沒有內嵌的sort()函式
如果我們直接使用sorted(),函式將只返回字典中的key列表,或者一個value列表

{'b': 2, 'c': 5, 'd': 6, 'f': 1, 'a': 4, 'e': 3}
['a', 'b', 'c', 'd', 'e', 'f']
[1, 2, 3, 4, 5, 6]

我們可以呼叫字典中的items()函式按key對它進行排序,並返回一個元組列表:

print(sorted(dic.items()))
[('a', 4), ('b', 2), ('c', 5), ('d', 6), ('e', 3), ('f', 1)]

如果我們想按相反的順序排序key,我們可以在排序函式中指定它進行反轉排序

print(sorted(dic.items(),reverse=True))
[('f', 1), ('e', 3), ('d', 6), ('c', 5), ('b', 2), ('a', 4)]

如果我們想要按 value 進行排序呢?有兩種方法可以做到這一點。一種是使用 sorted() ,但是指定使用 lambda 函式進行排序的關鍵;另一種是不使用預設字典型別,而是使用不同的字典型別,直接按 value 對字典進行排序。

對於第一個方法,sorted 函式是使用一個 key 引數,用於指定在進行比較之前對每個元素呼叫的函式(或其他可呼叫的函式)。在這裡,我們可以使用 lambda 函式來告訴 sorted()函式使用元素的哪一部分進行比較。具體來說:

print(sorted(dic.items(), key=lambda x: x[1]))
[('f', 1), ('b', 2), ('e', 3), ('a', 4), ('c', 5), ('d', 6)]

Python 是零索引,因此 x[1]指定每個元素的第二部分是一個字典,它是值。如果你想要一個反向順序,除了在 sorted()函式中新增一個反向引數,我們還可以在 lambda 函式中使用一個負號:

print(sorted(dic.items(), key=lambda x: -x[1]))
[('d', 6), ('c', 5), ('a', 4), ('e', 3), ('b', 2), ('f', 1)]

但是,這種技巧只有在 value 值為數值變數時才有效。如果它是一個字串變數,我們必須使用反向引數

如果您有一個值為數值的字典,那麼在建立字典時還可以使用不同的字典型別來直接對字典進行排序。字典型別可以是來自集合庫的 Counter:
Counter 是一個 dict 子類,它是一個無序集合,其中元素作為字典的 key 儲存,它們的計數作為字典的 value 儲存。
建立 Counter 時,使用以下程式碼

from collections import Counter
dic_cunter = Counter(dict(zip(lett, num)))
print(dic_cunter)
# Counter({'d': 6, 'c': 5, 'a': 4, 'e': 3, 'b': 2, 'f': 1})

我們不建立預設字典,而是建立一個Counter。這是有用的,因為當我們想要按 value 對字典進行排序時,我們可以使用 most_common()函式:
print(dic_cunter.most_common())
[('d', 6), ('c', 5), ('a', 4), ('e', 3), ('b', 2), ('f', 1)]
當您希望返回按 value 降序排列的元組列表時,它非常有用。
集合庫還有其他有趣的資料型別,如 OrderedDict,它保留插入的每個項的順序。欲瞭解更多資訊,可以檢視這個網址:https://docs.python.org/2/library/collections.html#。

返回一個已排序的字典

dic_sorted = sorted(dic.items())
print(dic_sorted)
dicc = {k: v for k, v in dic_sorted}
print(dicc)
[('a', 4), ('b', 2), ('c', 5), ('d', 6), ('e', 3), ('f', 1)]
{'a': 4, 'b': 2, 'c': 5, 'd': 6, 'e': 3, 'f': 1}