生活随笔
收集整理的這篇文章主要介紹了
Python之字典类型数据常见操作及排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、Python 字典
Python 的字典 dictionary 是一種靈活的數據結構類型,字典的每個鍵值對(key=>value)用冒號(:)分割,每個對之間用逗號(,)分割。 Python 字典里的鍵必須獨一無二,但值則不必的。字典的值可以取任何數據類型,但必須是不可變的(unhashable),如字符串、元組或數值,用列表是不行的。
二、字典的創建
字典的創建主要有 2 種方法: 如下所示,分別使用 2 種方法創建了字典 d1 和字典 d2:
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 }
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , }
>> > d2
= dict ( )
>> > d2
[ 'key5' ] = 1
>> > print ( d2
)
{ 'key5' : 1 }
三、訪問字典的鍵與值
可以直接根據 dict[‘鍵名’] 獲取一個值,也可以通過 dict.keys() 獲取所有的鍵或者 dict.values() 獲取所有的值。但需要注意的是 dict.keys() 或 dict.values() 返回的并非列表,需要使用 list 方法才能將所有的鍵和值轉化為列表形式:
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 }
>> > print ( d1
[ 'key3' ] )
4
>> > print ( d1
. keys
( ) )
dict_keys
( [ 'key3' , 'key2' , 'key1' ] )
>> > print ( list ( d1
. keys
( ) ) )
[ 'key3' , 'key2' , 'key1' ]
>> > print ( list ( d1
. values
( ) ) )
[ 4 , 5 , 4 ]
當嘗試用一個不存在的鍵獲取值時會出現 KeyError,最好是在獲取值前先使用 if key in dict 來判斷一個鍵是否已經存在。
>> > print ( d1
[ 'key6' ] )
Traceback
( most recent call last
) : File
"<input>" , line
1 , in < module
>
KeyError
: 'key6'
>> > print ( 'key6' in d1
)
False
四、遍歷字典
使用 for key, value in dict.items()可以遍歷整個字典,如果只喜歡遍歷鍵名或值,可以只使用 for key in dict.keys() 或 for value in dict.values()。
for key
, value
in d1
. items
( ) : print ( "{}->{}" . format ( key
, value
) ) for key
in d1
. keys
( ) : print ( key
) for value
in d1
. values
( ) : print ( value
)
五、字典數據的添加
字典與列表一樣都是可變類型的數據,所以可以實現數據的添加和修改。 實現的方法主要有兩種: dict 自帶的 update 方法非常有用,不僅可以插入新的鍵值對,還是實現兩個字典合并的首選方法:
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 }
>> > d1
. update
( { 'key4' : 2 } )
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 }
>> > d1
[ 'key5' ] = 1
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , 'key5' : 1 }
注意: 當創建的鍵名已存在時,dict[‘鍵名’]只會更新現有值,而不會創建新的鍵值對。
六、刪除字典元素
利用 del dict[‘key’] 可以刪除一個鍵值對,利用 del dict 可以刪除整個字典, 使用 dict.clear() 方法可以清空一個字典:
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , 'key5' : 1 }
>> > del d1
[ 'key5' ]
>> > print ( d1
)
{ 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 }
>> > d1
. clear
( )
>> > print ( d1
)
{ }
>> > del d1
>> > print ( d1
)
Traceback
( most recent call last
) : File
"<input>" , line
1 , in < module
>
NameError
: name
'd1' is not defined
七、利用 zip 方法由兩個列表創建字典
zip()函數來可以把 2 個或多個列表合并,并創建一個元組對的列表,使用 dict 方法可以將其變成字典。 元組對的數量以合并列表的最短長度為準,Python 3 中 zip 方法合并列表后生成的是 zip 對象,必需使用 dict 方法才能將其變成字典:
>> > l1
= [ 1 , 2 , 3 ]
>> > l2
= [ 'x' , 'y' , 'z' ]
>> > l3
= [ 'x' , 'y' ]
>> > zip ( l1
, l2
)
< zip object at
0x031D6828 >
>> > print ( list ( zip ( l1
, l2
) ) )
[ ( 1 , 'x' ) , ( 2 , 'y' ) , ( 3 , 'z' ) ]
>> > print ( list ( zip ( l1
, l3
) ) )
[ ( 1 , 'x' ) , ( 2 , 'y' ) ]
>> > print ( dict ( zip ( l1
, l3
) ) )
{ 1 : 'x' , 2 : 'y' }
實際上 zip 方法支持所有可迭代對象(字符串、列表、元祖、字典),而不僅僅是列表。利用這個特性,可以很容易創建各種字典,包括很復雜的字典。如下所示,注意 zip 對象支持直接遍歷,不需要先轉成 list 或 dict:
>> > l1
= [ 1 , 2 , 3 ]
>> > str1
= "abc"
>> > print ( dict ( zip ( l1
, str1
) ) )
{ 1 : 'a' , 2 : 'b' , 3 : 'c' }
>> > name
= [ "John" , "Jim" , "Lucy" ]
>> > year
= [ 1983 , 1985 , 1995 ]
>> > birth_year
= dict ( zip ( name
, year
) )
>> > print ( birth_year
)
{ 'John' : 1983 , 'Jim' : 1985 , 'Lucy' : 1995 }
>> > for name
, year
in zip ( name
, year
) : print ( "{} - {}" . format ( name
, year
) ) John
- 1983
Jim
- 1985
Lucy
- 1995
八、利用 zip 方法實現鍵值反轉
上文提到 zip 方法支持所有可迭代對象,也自然支持 dict.values() 和 dict.keys(),利用這個特性可以快速實現一個字典的鍵值反轉,如下所示:
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , }
>> > d2
= dict ( zip ( d1
. values
( ) , d1
. keys
( ) ) )
>> > print ( d2
)
{ 4 : 'key1' , 5 : 'key2' , 2 : 'key4' }
為什么使用 zip 方法后字典少了一個鍵? 還記得之前提到過鍵名必需唯一嗎? 可見 zip 方法對字典數據進行反轉必需考慮值相同而導致數據丟失的問題。
九、單個字典根據鍵名或值排序
使用 sorted 方法可以對單個字典的鍵名進行正向或逆向排序(reverse=True),得到是一個排過序的鍵名列表。然后通過使用 for key in sorted(d)遍歷排過序的鍵從而得到排過序的值。
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , }
>> > d3
= sorted ( d1
)
>> > print ( d3
)
[ 'key1' , 'key2' , 'key3' , 'key4' ]
>> > print ( sorted ( d1
, reverse
= True ) )
[ 'key4' , 'key3' , 'key2' , 'key1' ] >> > for key
in sorted ( d1
) : print ( d1
[ key
] )
4
5
4
2
如果希望根據值來排序,一般有 2 種方法: 使用匿名函數 lambda,此方法通常是一種更好的方法。 使用 zip 方法反轉字典:
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , }
>> > d2
= dict ( zip ( d1
. values
( ) , d1
. keys
( ) ) )
>> > print ( list ( d2
. keys
( ) ) )
[ 4 , 5 , 2 ]
>> > for key
in sorted ( d2
) : print ( d2
[ key
] ) key4
key1
key2
由于使用 zip 方法導致了數值的缺失,一個更好的方法是使用 lambda 函數指定 key 來排序。 使用 lambda 匿名函數,該方法設置排序的 key 為 d1[k],即每個鍵值對的值來排序:
>> > d1
= { 'key3' : 4 , 'key2' : 5 , 'key1' : 4 , 'key4' : 2 , }
>> > d2
= sorted ( d1
, key
= lambda k
: d1
[ k
] )
>> > print ( d2
)
[ 'key4' , 'key3' , 'key1' , 'key2' ]
>> > for key
in d2
: print ( d1
[ key
] ) 2
4
4
5
十、字典的運算
假設有如下兩個字典,能實現直接相加或相減嗎? 答案是不能的。Python 3并不支持字典的直接相加或相減,如果要合并兩個字典,需要使用 dict.update() 方法:
>> > d1
= { 'key1' : 1 , 'key2' : 7 }
>> > d2
= { 'key1' : 3 , 'key3' : 4 }
雖然 Python 不支持加減運算,但支持針對 keys() 和 values() 類似集合的運算, 可以用來求同求異,代碼如下所示:
>> > d1
. keys
( ) & d2
. keys
( )
{ 'key1' }
>> > d1
. keys
( ) - d2
. keys
( )
{ 'key2' }
十一、提取字典子集
假設有如下一個字典(姓名->分數),需要提取分數大于 60 的鍵值對組成一個新的字典子集,那么應該怎么辦呢?
d
= { 'John' : 50 , 'Mary' : 65 , 'Kitty' : 90 , 'Tom' : 100 }
>> > d
= { 'John' : 50 , 'Mary' : 65 , 'Kitty' : 90 , 'Tom' : 100 }
>> > sub_d
= { key
: value
for key
, value
in d
. items
( ) if value
>= 60 }
>> > print ( sub_d
)
{ 'Mary' : 65 , 'Kitty' : 90 , 'Tom' : 100 }
十二、字典列表的排序
實際應用中更常見的是對字典列表排序,而不是對當個字典的鍵或值進行排序。假設有一個字典列表,想根據某個或某幾個字典字段來排序這個列表,這時需要使用 operator 模塊的 itemgetter 函數,可以非常容易的排序這樣的數據結構。假設從數據庫中檢索出來網站會員信息列表,并且以下列的數據結構返回:
rows
= [ { 'fname' : 'Brian' , 'lname' : 'Jones' , 'uid' : 1003 } , { 'fname' : 'David' , 'lname' : 'Beazley' , 'uid' : 1002 } , { 'fname' : 'John' , 'lname' : 'Cleese' , 'uid' : 1001 } , { 'fname' : 'Big' , 'lname' : 'Jones' , 'uid' : 1004 } ]
根據任意的字典字段來排序輸入結果行是很容易實現的,代碼示例:
from operator
import itemgetterrows_by_fname
= sorted ( rows
, key
= itemgetter
( 'fname' ) ) print ( rows_by_fname
)
代碼的輸出如下,注意該方法返回的直接排過序的完整字典,而不是排過序的鍵名列表:
[ { 'fname' : 'Big' , 'uid' : 1004 , 'lname' : 'Jones' } , { 'fname' : 'Brian' , 'uid' : 1003 , 'lname' : 'Jones' } , { 'fname' : 'David' , 'uid' : 1002 , 'lname' : 'Beazley' } , { 'fname' : 'John' , 'uid' : 1001 , 'lname' : 'Cleese' } ]
itemgetter() 函數也支持多個 keys,如下:
rows_by_lfname
= sorted ( rows
, key
= itemgetter
( 'lname' , 'fname' ) ) print ( rows_by_lfname
)
[ { 'fname' : 'David' , 'uid' : 1002 , 'lname' : 'Beazley' } , { 'fname' : 'John' , 'uid' : 1001 , 'lname' : 'Cleese' } , { 'fname' : 'Big' , 'uid' : 1004 , 'lname' : 'Jones' } , { 'fname' : 'Brian' , 'uid' : 1003 , 'lname' : 'Jones' } ]
十三、字典列表的去重
假設有如下一個字典列表,需要實現字典值的去重,即提取所有獨特的值組成一個列表,那么一個最好的方式就是使用列表表達式:
>> > d1
= [ { 'key1' : 2 } , { 'key1' : 3 } , { 'key2' : 2 } , { 'key3' : 4 } ]
>> > u_value
= set ( val
for dict in d1
for val
in dict . values
( ) )
>> > print ( list ( u_value
) )
[ 2 , 3 , 4 ]
同樣,可以使用列表表達式提取所有獨特的鍵名組成一個列表:
>> > d1
= [ { 'key1' : 2 } , { 'key1' : 3 } , { 'key2' : 2 } , { 'key3' : 4 } ]
>> > u_key
= set ( key
for dict in d1
for key
in dict . keys
( ) )
>> > print ( list ( u_key
) )
[ 'key2' , 'key3' , 'key1' ]
總結
以上是生活随笔 為你收集整理的Python之字典类型数据常见操作及排序 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。