Python3學習筆記 | 七、Python的類型與運算-字典

  • 2019 年 10 月 6 日
  • 筆記

一、字典簡介

字典在Python里是無序集合對象類型,字典的值都有獨立的唯一的鍵(Key),用相應的鍵來取值。

Python字典主要特性如下: • 通過鍵而不是偏移量來讀取 • 任意對象的無序組合 • 可變長,異構,任意嵌套 • 屬於可映射類型 • 對象引用表

字典用法注意事項: • 序列運算無效 - 串聯,分片不能使用 • 對新索引(鍵)賦值會添加項 • 鍵不一定是字元串 - 只要是不可變的對象(除了列表和字典)

二、字典的操作

1、基本操作

字典的賦值(格式):

>>> dict = {'D':'Dora','E':'Emon'} #在這裡'D'和'E'是鍵,Dora和Emon是相應的值。

取值:

>>> print("DaXiong's friend is {}{}".format(dict['D'],dict['E']))  DaXiong's friend is DoraEmon

長度:

>>> len(dict)2

判斷特定的鍵是不是存在於字典里:

>>> 'D' in dictTrue

列出所有的鍵(2.x和3.x有區別):

>>> list(dict.keys())  ['D', 'E']

2、原處修改

更改特定鍵的值:

>>> dict = {'D':'Dora','E':'Emon'}  >>> dict['D'] = 'DaXiong'  >>> dict  {'D': 'DaXiong', 'E': 'Emon'}

增加新的鍵和相應的值:

>>> dict['J'] = 'Jing'  >>> dict  {'D': 'DaXiong', 'E': 'Emon', 'J': 'Jing'}

刪除一個鍵:

>>> del dict['D']  >>> dict  {'E': 'Emon', 'J': 'Jing'}

三、字典的方法

1、字典的取值

取所有的值:

>>> dict = {'D':'Dora','E':'Emon'}  >>> list(dict.keys())  ['D', 'E']  >>> list(dict.values())  ['Dora', 'Emon']  >>> list(dict.items())  [('D', 'Dora'), ('E', 'Emon')]

不能確定某個值是不是存在的時候:

>>> dict.get('D','Not Found')  #存在就輸出Key對應的Values,不存在就輸出自己定義的字元,這裡的『Not Found』就是自己定義的  'Dora'  >>> dict.get('Q','Not Found')  'Not Found'

2、創建字典的方法

最原始的方法:

>>> dict = {'D':'Dora','E':'Emon'}

按鍵賦值方法:

>>> dict = {}  >>> dict['D'] = 'Dora'  >>> dict['E'] = 'Emon'

變數賦值方法:

c = dict(name='Allen', age=14, gender='male') #此方法沒有在我自己的電腦上嘗試成功,但語法是沒有問題的

元祖列表方法:

e=dict([('name','Allen'),('age',21),('gender','male')]) #此方法沒有在我自己的電腦上嘗試成功,但語法是沒有問題的

參考鏈接:https://blog.csdn.net/u014291497/article/details/51052139

3、字典的比較

>>> Quentities = {'toast': 45,'muffin': 23,'ham': 78,'spam': 56,'eggs': 89}  >>> max(Quentities)  'toast'  >>> min(Quentities)  'eggs'

我們發現,這裡比較的是「鍵」,而不是相應的「值」,這裡使用zip()函數將Quentities字典中的Key與Values順序進行調換。

zip()是Python的一個內建函數,它接受一系列可迭代的對象作為參數,將對象中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表),具體可以參考鏈接:https://blog.csdn.net/eric_sunah/article/details/20551087

>>> max(zip(Quentities.values(),Quentities.keys()))  (89, 'eggs')  >>> min(zip(Quentities.values(),Quentities.keys()))  (23, 'muffin')  >>> sorted(zip(Quentities.values(),Quentities.keys()))  [(23, 'muffin'), (45, 'toast'), (56, 'spam'), (78, 'ham'), (89, 'eggs')]

上面使用sorted進行排序,更改順序只需要加reverse=True

另外一種字典比較方式:

>>> Quentities = {'toast': 45,'muffin': 23,'ham': 78,'spam': 56,'eggs': 89}  >>> sorted(zip(Quentities.values(),Quentities.keys()))  [(23, 'muffin'), (45, 'toast'), (56, 'spam'), (78, 'ham'), (89, 'eggs')]  >>> max(Quentities,key=lambda k: Quentities[k])  'eggs'  >>> min(Quentities,key=lambda k: Quentities[k])  'muffin'

關於lambda,你可以把這個當成如下函數:

>>> def get_count(k):  ... return Quentities[k]  ...  >>> min(Quentities,key=get_count)  'muffin'

整體意思就是輸出Key最大或最小對應的Values。

4、字典列表的排序

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}]

需要按fname或者uid排序時需要operator模組里的itemgetter函數:

>>> from operator import itemgetter  >>> rows_by_fname = sorted(rows, key=itemgetter('fname'))  >>> rows_by_uid = sorted(rows, key=itemgetter('uid'))  >>> print(rows_by_fname)  [{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]  >>> print(rows_by_uid)  [{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]

需要按lname和fname的順序排列時:

>>> rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))  >>> print(rows_by_lfname)  [{'lname': 'Beazley', 'uid': 1002, 'fname': 'David'},  {'lname': 'Cleese', 'uid': 1001, 'fname': 'John'},  {'lname': 'Jones', 'uid': 1004, 'fname': 'Big'},  {'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}]

5、通過某個欄位將記錄分組

>>> rows = [  ... {'address': '5412 N CLARK', 'date': '07/01/2012'},  ... {'address': '5148 N CLARK', 'date': '07/04/2012'},  ... {'address': '5800 E 58TH', 'date': '07/02/2012'},  ... {'address': '2122 N CLARK', 'date': '07/03/2012'},  ... {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},  ... {'address': '1060 W ADDISON', 'date': '07/02/2012'},  ... {'address': '4801 N BROADWAY', 'date': '07/01/2012'},  ... {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},  ... ]  >>> from operator import itemgetter  >>> from itertools import groupby  >>> rows.sort(key=itemgetter('date'))  >>> for date, items in groupby(rows, key=itemgetter('date')):  ... print(date)  ... for i in items:  ... print(' ', i)    07/01/2012  {'date': '07/01/2012', 'address': '5412 N CLARK'}  {'date': '07/01/2012', 'address': '4801 N BROADWAY'}  07/02/2012  {'date': '07/02/2012', 'address': '5800 E 58TH'}  {'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}  {'date': '07/02/2012', 'address': '1060 W ADDISON'}  07/03/2012  {'date': '07/03/2012', 'address': '2122 N CLARK'}  07/04/2012  {'date': '07/04/2012', 'address': '5148 N CLARK'}  {'date': '07/04/2012', 'address': '1039 W GRANVILLE'}