1. 程式人生 > >python中列表、元組及字典的排序

python中列表、元組及字典的排序

0 序言

首先介紹,在Python排序中,常用的兩個排序函式是sort()和sorted()。在講列表、元組和字典的排序之前,有必介紹這兩個函式。下面基於Python3,檢視該函式的引數值。(Python2和Pyhton3對這兩函式的引數設定有所差別)

在Python中檢視內建函式和檢視函式的屬性、引數方法為:

#dir(__builtins__)
#呼叫檢視Python中所有的內建函式
#純小寫的均是內部函式,若是想要知道某個函式的具體意思可以用help,例如:>>> help(input)
help(sorted)
help(list.sort)

(1)help(sorted)

這裡寫圖片描述

(2)help(list.sort)

這裡寫圖片描述
1、sort是容器的函式:sort( key=None, reverse=False)
2、sorted是python的內建函式:sorted(iterable, key=None, reverse=False)

引數解析:
* key:用列表元素的某個屬性或函式作為關鍵字。
* reverse:排序規則,可以選擇True或者False。
* sorted多一個引數iterable:待排序的可迭代型別的容器
* reverse=False,表示升序排序,in ascending order,預設首元素排序;reverse=True,表示降序排序,in descending order。

(3)注意:python2和python3的區別

來看python2中對函式的引數解釋:
這裡寫圖片描述
* 可以看出,在python2中,sorted()函式有cmp引數,在排序中通常使用cmp引數和key引數。鑑於python3中去除了cmp引數,為避免版本相容問題,建議今後排序儘量不用cmp。

1 列表的排序

(1)列表元素為數值

a=[1,2,5,3,9,4,6,8,7,0,12]
a.sort()
print(a)
輸出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
b=[1,2,5,3,9,4,6,8,7,0,12]
print(sorted(b))
輸出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12] print(b) 輸出:[1, 2, 5, 3, 9, 4, 6, 8, 7, 0, 12]

區別:
* 對於一個無序的列表a,呼叫a.sort(),對a進行排序後返回a,sort()函式修改待排序的列表內容。
* 而對於同樣一個無序的列表b,呼叫sorted(b),對b進行排序後返回一個新的列表,而對b不產生影響。

總結:sort()函式是對原列表進行排序,sorted()函式是產生新的列表進行排序。

(2)列表元素為元組

list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
list1.sort()
print(list1)
輸出:[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]
list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
print(sorted(list1))
輸出:[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]

print(list1)
輸出:[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

總結:在預設排序下,列表元素會根據列表中的第一個元素進行排序即list[0]或者tuple[0]。

(3)通過key函式進行自定義排序(以sorted()為例)

  • 其一:升降序

通過使用lambda表示式:以任意順序進行排序。關於lambda表示式的介紹,文末詳述。

list1=[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
print(sorted(list1,key=lambda x:x[0]))
#輸出:[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Zogan', 20)]
print(sorted(list1,key=lambda x:x[1]))
#輸出:[(5, 'Lucy', 19), (2, 'Mike', 22), (8, 'Zogan', 20)]
print(sorted(list1,key=lambda x:x[2]))
#輸出:[(5, 'Lucy', 19), (8, 'Zogan', 20), (2, 'Mike', 22)]

備註:通過reverse函式設定True或False,只是實現升降序排序。

  • 其二:自定義排序規則(根據列表內元素長度排序)
L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
def f(x):
    return len(x)
L.sort(key=f)
print (L)

#輸出:[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]

(4)呼叫operator庫實現:加速、多級排序

  • 呼叫operator庫中的itemgetter函式實現:排序加速
from operator import itemgetter
list1=[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
print(sorted(list1,key=itemgetter(0)))
#輸出:[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Zogan', 20)]
print(sorted(list1,key=itemgetter(1)))
#輸出:[(5, 'Lucy', 19), (2, 'Mike', 22), (8, 'Zogan', 20)]
print(sorted(list1,key=itemgetter(2)))
#輸出:[(5, 'Lucy', 19), (8, 'Zogan', 20), (2, 'Mike', 22)]
  • 呼叫operator庫中的itemgetter函式實現:多級排序
from operator import itemgetter
list1=[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
print(sorted(list1,key=itemgetter(0,2)))
#輸出:[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Zogan', 20)]

註釋:
(1)第一級排序:通過[0]元素排序
(2)第二級排序:經過第一級排序後,再通過[2]進行排序。

2 python的字典

(1)字典的總體介紹

在Python中,字典是一系列鍵值對,即每個鍵都與一個值相關聯,可以使用鍵來訪問與之關聯的值,不像列表的下標,字典的索引是可以使用許多不同資料型別的。(與鍵相關聯的值可以是數字、字串、列表乃至字典,事實上,可將任何python的物件作為字典中的值。

即:
* 字典放入列表中:作為列表的元素
* 列表放入字典中:作為字典的值
* 字典放入字典中:作為字典的值

(2)遍歷字典的三個方法

  • items()方法:返回一個列表,內部含有鍵值對的元組。
#result是一個字典
result.items()=[('安徽', 53), ('廣東', 155), ('陝西', 4)]
  • keys()方法:返回僅包含鍵的列表。
  • values()方法:返回僅包含值的列表。

可以用這三個方法來幫助for迴圈迭代字典中的每個值。

(3)對由字典排序 ,返回由tuple組成的List,不再是字典。

#intems()返回的是儲存在列表中的元組。
#利用key = lambda x:x[1],按照元組的第二個元素進行降序排序
results = sorted(result.items(),key = lambda x:x[1],reverse = True)
print(results)

3 補充知識點:lambda表示式

(1)初步介紹
在Python中,lambda的語法是唯一的。其形式如下:

 lambda argument_list: expression
  • 其中,lambda是Python預留的關鍵字,argument_list和expression由使用者自定義。
  • 這裡的argument_list是引數列表
  • expression是一個關於引數的表示式。表示式中出現的引數需要在argument_list中有定義,並且表示式只能是單行的。

(2)簡單使用

lambda x, y: x*y;

函式輸入是x和y,輸出是它們的積x*y

(3)其他使用情況
* filter函式。

此時lambda函式用於指定過濾列表元素的條件。例如:

filter(lambda x: x % 3 == 0, [1, 2, 3])

指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]。
* sorted函式。

此時lambda函式用於指定對列表中所有元素進行排序的準則。例如:

sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))

將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
* map函式。

此時lambda函式用於指定對列表中每一個元素的共同操作。例如:

map(lambda x: x+1, [1, 2,3])

將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。