在程序中使用字典進(jìn)行數(shù)據(jù)信息統(tǒng)計(jì)時(shí),由于字典是無(wú)序的所以打印字典時(shí)內(nèi)容也是無(wú)序的。因此,為了使統(tǒng)計(jì)得到的結(jié)果更方便查看需要進(jìn)行排序。Python中字典的排序分為按“鍵”排序和按“值”排序。那么python如何對(duì)字典排序呢?一起來(lái)了解下吧:
?
python如何對(duì)字典排序
?
?
實(shí)際應(yīng)用中我們確實(shí)有這種排序的“需求”-----按照values的值“排序”輸出,或者按照別的奇怪的順序進(jìn)行輸出,我們只需要把字典轉(zhuǎn)化成list或者tuple,把字典每一對(duì)鍵值轉(zhuǎn)化為list中的兩位子list或者子tuple再輸出,就可以達(dá)到我們的目的:
?
舉例如下:
?
x={2:1,3:4,4:2,1:5,5:3}
?
import operator
?
sorted_x=sorted(x.items(),key=operator.itemgetter(0))#按照item中的*個(gè)字符進(jìn)行排序,即按照key排序
?
print x
?
print sorted_x
?
print dict(sorted_x)
?
輸出結(jié)果為:
?
{1: 5, 2: 1, 3: 4, 4: 2, 5: 3}
?
[(1, 5), (2, 1), (3, 4), (4, 2), (5, 3)]
?
{1: 5, 2: 1, 3: 4, 4: 2, 5: 3}
?
字典始終都按照key從小到大排序,與定義過(guò)程無(wú)關(guān),轉(zhuǎn)化為list嵌套tuple這里也依然按著key排序
?
x={2:1,3:4,4:2,1:5,5:3}
?
import operator
?
sorted_x=sorted(x.items(),key=operator.itemgetter(1))#這里改為按照item的第二個(gè)字符排序,即value排序
?
print x
?
print sorted_x
?
print dict(sorted_x)
?
輸出結(jié)果為:
?
{1: 5, 2: 1, 3: 4, 4: 2, 5: 3}
?
[(2, 1), (4, 2), (5, 3), (3, 4), (1, 5)]
?
{1: 5, 2: 1, 3: 4, 4: 2, 5: 3}
?
字典的順序依舊不變,但轉(zhuǎn)化為list嵌套tuple格式之后,完成了按照value排序的操作。
?
python中字典按鍵或鍵值如何排序
?
按“值”排序
?
按“值”排序就是根據(jù)字典的值進(jìn)行排序,可以使用內(nèi)置的sorted()函數(shù)。
?
?sorted(iterable[, cmp[, key[, reverse]]])
?
iterable:是可迭代類型類型;
?
cmp:用于比較的函數(shù),比較什么由key決定,有默認(rèn)值,迭代集合中的一項(xiàng);
?
key:用列表元素的某個(gè)屬性和函數(shù)進(jìn)行作為關(guān)鍵字,有默認(rèn)值,迭代集合中的一項(xiàng);
?
reverse:排序規(guī)則. reverse = True 或者 reverse = False,有默認(rèn)值,默認(rèn)為升序排列(False)。
?
返回值:是一個(gè)經(jīng)過(guò)排序的可迭代類型,與iterable一樣。一般來(lái)說(shuō),cmp和key可以使用lambda表達(dá)式。
?
如果對(duì)字典進(jìn)行排序,常用的形式如下:
?
sorted(dict.items(), key=lambda e:e[1], reverse=True)
?
其中,e表示dict.items()中的一個(gè)元素,e[0]表示按鍵排序,e[1]則表示按值排序。reverse=False可以省略,默認(rèn)為升序排列。
?
說(shuō)明:字典的items()函數(shù)返回的是一個(gè)列表,列表的每個(gè)元素是一個(gè)鍵和值組成的元組。因此,sorted(dict.items(), key=lambda e:e[1], reverse=True)返回的值同樣是由元組組成的列表。
?
例:
?
x=[4,6,2,1,7,9,4]
?
y=x[:]
?
y.sort()
?
print x
?
print y
?
輸出結(jié)果如下:
?
[4, 6, 2, 1, 7, 9, 4]
?
[1, 2, 4, 4, 6, 7, 9]
?
說(shuō)明:調(diào)用x[:]得到的是包含了x所有元素的分片,這是一種很有效率的復(fù)制整個(gè)列表的方法。通過(guò)y=x簡(jiǎn)單的將x復(fù)制給y是沒(méi)有用的,因?yàn)檫@樣做就讓x和y都指向了同一個(gè)列表了。
?
按“鍵”排序
?
對(duì)字典進(jìn)行按鍵排序也可以使用上面的sorted函數(shù),只要改為sorted(dict.items(), key=lambda e:e[0], reverse=True)就可以了。不過(guò)除了這個(gè)方式之外,還有另外的方法:通過(guò)列表的排序來(lái)達(dá)到使字典有序的目的。
?
用到的知識(shí):字典的keys()函數(shù)返回列表形式的鍵值,將該列表排序即可。列表的排序使用列表的sort()函數(shù),詳細(xì)內(nèi)容參考列表排序。
?
總結(jié):?
?
方法1:最簡(jiǎn)單的方法,排列元素(key/value對(duì)),然后挑出值。字典的items方法,會(huì)返回一個(gè)元組的列表,其中每個(gè)元組都包含一對(duì)項(xiàng)目 ——鍵與對(duì)應(yīng)的值。此時(shí)排序可以sort()方法。
?
def sortedDictValues1(adict):
?
items = adict.items()
?
items.sort()
?
return [value? for key, value? in items]
?
方法2:使用排列鍵(key)的方式,挑出值,速度比方法1快。字典對(duì)象的keys()方法返回字典中所有鍵值組成的列表,次序是隨機(jī)的。需要排序時(shí)只要對(duì)返回的鍵值列表使用sort()方法。
?
def sortedDictValues1(adict):
?
keys = adict.keys()
?
keys.sort()
?
return [adict[key]? for key? in keys]
?
方法3:通過(guò)映射的方法去更有效的執(zhí)行*一步
?
def sortedDictValues1(adict):
?
keys = adict.keys()
?
keys.sort()
?
return map (adict.get,keys )
?
方法4:對(duì)字典按鍵排序,用元組列表的形式返回,同時(shí)使用lambda函數(shù)來(lái)進(jìn)行;
?
?sorted(iterable[, cmp[, key[, reverse]]]
?
cmp和key一般使用lambda
?
例:
?
>>> d={"ok":1,"no":2}? #對(duì)字典按鍵排序,用元組列表的形式返回
?
>>> sorted(d.items(), key=lambda d:d[0])
?
[('no', 2), ('ok', 1)]? #對(duì)字典按值排序,用元組列表的形式返回
?
>>> sorted(d.items(), key=lambda d:d[1])
?
[('ok', 1), ('no', 2)]
?
python數(shù)組或字典變量如何排序
?
?數(shù)據(jù)處理中需要對(duì)數(shù)組按行或按列進(jìn)行排序,或者對(duì)字典變量中的鍵值對(duì)排序。主要用到的兩個(gè)函數(shù)為np.lexsort()和內(nèi)置函數(shù)sorted()。如下說(shuō)明處理過(guò)程。
?
對(duì)數(shù)組按*一行排序,且保持列的相對(duì)位置不變
?
?
>>> import numpy as np
?
>>> data=np.array([[ 2,? 7,? 1,? 2],[35,? 9,? 1,? 2],[22, 4,? 4,? 2]])
?
>>> data
?
array([[ 2,? 7,? 1,? 2],
?
? ? ? ?[35,? 9,? 1,? 2],
?
? ? ? ?[22,? 4,? 4,? 2]])
?
>>> idx=np.lexsort(data)#參數(shù)為二維數(shù)組時(shí),按照*一行升序,*一行的值相同時(shí)按照倒數(shù)第二行升序
?
>>> idx
?
array([3, 2, 1, 0])
?
>>> data[:, idx]
?
array([[ 2,? 1,? 7,? 2],
?
? ? ? ?[ 2,? 1,? 9, 35],
?
? ? ? ?[ 2,? 4,? 4, 22]])
?
對(duì)數(shù)組按*列排序,且保持行的相對(duì)位置不變
?
>>> import numpy as np
?
>>> data=np.array([[ 2,? 7,? 1,? 2],[35,? 9,? 1,? 2],[22, 4,? 4,? 2]])??
?
>>> data
?
array([[ 2,? 7,? 1,? 2],
?
? ? ? ?[35,? 9,? 1,? 2],
?
? ? ? ?[22,? 4,? 4,? 2]])?
?
>>> data_T=data[:,::-1].T #通過(guò)將列逆序,并求矩陣的轉(zhuǎn)置,從而將*列變?yōu)?一行
?
>>> data_T
?
array([[ 2,? 2,? 2],
?
? ? ? ?[ 1,? 1,? 4],
?
? ? ? ?[ 7,? 9,? 4],
?
? ? ? ?[ 2, 35, 22]])
?
>>> idx=np.lexsort(data_T)
?
>>> idx
?
array([0, 2, 1])
?
>>> data[idx]
?
array([[ 2,? 7,? 1,? 2],
?
? ? ? ?[22,? 4,? 4,? 2],
?
? ? ? ?[35,? 9,? 1,? 2]])
?
按照字典變量的鍵或值進(jìn)行排序
?
>>> data={3:5, 2:1, 5:4, 8:4, 4:9}
?
>>> data
?
{8: 4, 2: 1, 3: 5, 4: 9, 5: 4}
?
>>> data_key=sorted(data.items(), key=lambda e:e[0], reverse=False) #按字典的鍵進(jìn)行升序
?
>>> data_key
?
[(2, 1), (3, 5), (4, 9), (5, 4), (8, 4)]
?
>>> data_key=sorted(data.items(), key=lambda e:e[0], reverse=True)#按字典的鍵進(jìn)行降序
?
>>> data_key
?
[(8, 4), (5, 4), (4, 9), (3, 5), (2, 1)]
?
>>> data_val=sorted(data.items(), key=lambda e:e[1], reverse=False)#按字典的值進(jìn)行升序
?
>>> data_val
?
[(2, 1), (8, 4), (5, 4), (3, 5), (4, 9)]
?
Python排序字典的方法
?
Python排序可以通過(guò)內(nèi)建函數(shù)sorted()實(shí)現(xiàn),同時(shí)部分擁有sort()方法的數(shù)據(jù)類型也可以通過(guò)sort實(shí)現(xiàn),由于字典沒(méi)有sort方法,所以用sorted實(shí)現(xiàn)
?
通過(guò)key值排序
?
d = {'a': 2, 'A': 1, 1: 3, 'b': 2}
?
sorted_key_list = sorted(d)
?
print(sorted_key_list)
?
sorted_dict = map(lambda x:{x:d[x]}, sorted_key_list)
?
print(sorted_dict)
?
結(jié)果如下:
?
[1, 'A', 'a', 'b'] #根據(jù)ascii碼大小排序
?
[{1: 3}, {'A': 1}, {'a': 2}, {'b': 2}]
?
結(jié)論:
?
sorted函數(shù)會(huì)產(chǎn)生一個(gè)新的列表,而sort方法則會(huì)改變?cè)璱terable對(duì)象
?
通過(guò)value排序
?
d = {'a': 2, 'A': 1, 1: 3, 'b': 2}
?
sorted_key_list = sorted(d, key=lambda x:d[x])
?
# sorted_key_list = sorted(d, key=lambda x:d[x], reverse=True)? ?倒序排列
?
print(sorted_key_list)
?
sorted_dict = map(lambda x:{x:d[x]}, sorted_key_list)
?
print(sorted_dict)
?
結(jié)果如下:
?
['A', 'a', 'b', 1]
?
[{'A': 1}, {'a': 2}, {'b': 2}, {1: 3}]
?
結(jié)論:
?
key是排序的索引,是一種規(guī)則,對(duì)于字典來(lái)說(shuō),排序的對(duì)象始終是鍵構(gòu)成的列表,這里的規(guī)則為 lambda x:d[x], 即以字典的值為索引排序
?
reverse意為翻轉(zhuǎn),默認(rèn)此參數(shù)為False不翻轉(zhuǎn),即reverse=False,那就是正序*字符ascii(其他語(yǔ)言按*unicode編碼大小排序,中文無(wú)意義啊貌似)由小到大排序,改為True即可由大到小排序了。
?