Python 是一個解釋型語言
簡單來說,就是Python文件在執行的時候 基本上 就是 我們的代碼被解釋器一行行的解釋成 計算機能夠理解的源碼,然後一行行的執行。
但是在解釋執行前,Python會對所有的代碼進行一次 通篇的語法檢查,這個時候就會報出語法錯誤 (SyntaxError) , 題主的問題就是這樣的。 所以當我們看到 SyntaxError 時,應該是最不用擔心的時候了,因爲 真正需要擔心的還沒有開始嘛(解釋運行時),這時候報的錯,都是些小錯,語法錯誤。
字典基本用法:
Python 中的字典是Python中一個鍵值映射的數據結構,下面介紹一下如何優雅的操作字典.
1.1 創建字典
Python有兩種方法可以創建字典,第一種是使用花括號,另一種是使用內建 函數dict
>>> info = {}
>>> info = dict()
1.2 初始化字典
Python可以在創建字典的時候初始化字典
>>> info = {"name" : 'cold'}
>>> info = dict(name = 'cold') # 更優雅
很明顯第二種方法更加的優雅和減少一些特殊字符的輸入,但是有種情況第二種不能勝任
>>> key = 'name'
>>> info = { key :'cold'} # {'name':'cold'}
>>> info = dict(key = 'cold') # {'key': 'cold'}
明顯第二種方法就會引發一個不容易找到的bug
Python字典還有一種初始化方式,就是使用字典的fromkeys方法可以從列表中獲取元素作爲鍵並用None或fromkeys方法的第二個參數初始化
>>> info = {}.fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'])
>>> info
{'blog': None, 'name': None}
>>> info = dict().fromkeys(['name', 'blog'], 'linuxzen.com')
>>> info
{'blog': 'linuxzen.com', 'name': 'linuxzen.com'}
1.3 優雅的獲取鍵值
字典可以這樣獲取到鍵的值
>>> info = {'name':'cold', 'blog':'linuxzen.com'}
>>> info['name']
'cold'
但是如果獲取不存在的鍵的值就會觸發的一個KeyError異常,字典有一個get方法,可以使用字典get方法更加優雅的獲取字典
>>> info = dict(name= 'cold', blog='www.linuxzen.com')
>>> info.get('name')
'cold'
>>> info.get('blogname')
None
>>> info.get('blogname', 'linuxzen')
'linuxzen'
我們看到使用get方法獲取不存在的鍵值的時候不會觸發異常,同時get方法接收兩個參數,當不存在該鍵的時候就會返回第二個參數的值 我們可以看到使用get更加的優雅
如果字典已知,我們可以任選一個,而當我們不確定字典中是否存在某個鍵時,我之前的做法如下
if 'age' in a.keys():
print a['age']
因爲不先判斷的話,直接使用a[‘age’]會導致報錯keyerror,提示沒有該key的值。
而是用a.get(‘age’) 則不會產生錯誤,解析器返回值如果存在就返回相應的value, 如果不存在就返回None.
if a.get('age'):
print a['age']
而想要改變value 的值,則需要通過
a[‘name’]=’Jack’
使用a.get(‘name’) = ‘Jack’
編譯器則會提示 SyntaxError: can’t assign to function call
1.4 更新/添加
Python 字典可以使用鍵作爲索引來訪問/更新/添加值
>>> info = dict()
>>> info['name'] = 'cold'
>>> info['blog'] = 'linuxzen.com'
>>> info
{'blog': 'linuxzen.com', 'name': 'cold'}
>>> info
{'blog': 'linuxzen.com', 'name': 'cold night'}
同時Python字典的update方法也可以更新和添加字典
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.update({'name':'cold night', 'blogname':'linuxzen'})
>>> info
{'blog': 'linuxzen.com', 'name': 'cold night', 'blogname': 'linuxzen'}
>>> info.update(name='cold', blog='www.linuxzen.com') # 更優雅
>>> info
{'blog': 'www.linuxzen.com', 'name': 'cold', 'blogname': 'linuxzen'}
Python字典的update方法可以使用一個字典來更新字典,也可以使用參數傳遞類似dict函數一樣的方式更新一個字典,上面代碼中哦功能的第二個更加優雅,但是同樣和dict函數類似,鍵是變量時也只取字面值
1.5 字典刪除
可以調用Python內置關鍵字del來刪除一個鍵值
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info
{'blog': 'linuxzen.com', 'name': 'cold'}
>>> del info['name']
>>> info
{'blog': 'linuxzen.com'}
同時也可以使用字典的pop方法來取出一個鍵值,並刪除
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.pop('name')
'cold'
>>> info
{'blog': 'linuxzen.com'}
1.6 遍歷
user = { 'first': 'dfe', 'username':'ddd', 'last':'dfe' } for key,value in user.items(): print(key + value) # firstdfe # usernameddd # lastdfe
注意:python3.6改寫了dict內部算法,3.6的dict是有序的(遍歷字典時鍵值對返回的順序與存儲順序相同),在此本本之前是無序的
1.7 其他操作
獲取所有key
>>> info = dict(name='cold', blog='linuxzen.com')
>>> info.keys()
['blog', 'name']
獲取key,value並循環
>>> info = dict(name='cold', blog='linuxzen.com')
>>> for key, value in info.items():
... print key, ':', value
...
blog : linuxzen.com
name : cold
問題:
將列表[1,2,3,4,5,6,7,8,9]中大於5的添加到字典的鍵爲k1中,其餘存儲到鍵爲k2中
方法
方法1、常規思路
list = [1,2,3,4,5,6,7,8,9] def dictSort(): dict = {} for item in list: if item > 6: if 'k1' in dict.keys(): dict['k1'].append(item) else: dict['k1'] = [item] else: if 'k2' in dict.keys(): dict.get('k2').append(item) # dict.get('k2') = item # can't assign to function call else: dict['k2'] = [item] print(dict) # {'k2': [1, 2, 3, 4, 5, 6], 'k1': [7, 8, 9]} if __name__ == '__main__': dictSort()
注意:1、語法錯誤: 不能給(can't) 函數(function)調用(call) 賦值(assign) 2、dict['k2'] = item是無錯的,實際dict['k2']是一個list
方法3、dict的setdefault()方法
list = [1,2,3,4,5,6,7,8,9]
def dictSort():
dict = {}
for item in list:
if item > 6:
dict.setdefault('k1',[]).append(item)
else:
dict.setdefault('k2', []).append(item)
print(dict) # {'k2': [1, 2, 3, 4, 5, 6], 'k1': [7, 8, 9]}
if __name__ == '__main__':
dictSort()
方法3
使用collections.defaultdict().
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def defDictSort():
dic = collections.defaultdict(list)
# loop list
for value in all_items:
if value >66:
dic["k1"].append(value)
else:
dic["k2"].append(value)
print(dic)
if __name__ == '__main__':
defDictSort()
輸出結果
defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99]})
定義字典變量的時候,原來還要指定values的屬性,最開始寫成了下面這樣
dic = collections.defaultdict()
方法4:
使用D.fromkeys()生成一個“默認”的字典。然後根據條件再去追加values.
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def dictByFromKeys():
dic = {}.fromkeys(("k1", "k2"))
# get values by loop list
for value in all_items:
if value > 66:
if dic["k1"] is None:
dic["k1"] = [value]
else:
dic["k1"].append(value)
else:
if dic["k2"] is None:
dic["k2"] = [value]
else:
dic["k2"].append(value)
print(dic)
if __name__ == '__main__':
dictByFromKeys()
結果輸出如下所示:
{'k1': [77, 88, 99], 'k2': [11, 22, 33, 44, 55, 66]}
代碼寫完調試的時候,fromkeys()默認的value是None,上來拿到list的元素後就直接判斷append了,導致報錯:NoneType 沒有append屬性。
然後間接轉換了一下,先去判斷是否爲None,如果是就直接賦值,如果不是,那證明已經有數據加入了,然後再使用append方法就沒問題了。
方法5
藉助defaultdict跟set,但缺點是,values是無序的。
# -*- encoding = utf-8 -*-
import collections
all_items = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def dictBySet():
dic = collections.defaultdict(set)
# loop list
for value in all_items:
if value > 66:
dic["k1"].add(value)
else:
dic["k2"].add(value)
print(dic)
if __name__ == '__main__':
dictBySet()
輸出結果:
defaultdict(<class 'set'>, {'k1': {88, 99, 77}, 'k2': {33, 66, 11, 44, 22, 55}})
方法借鑑:https://blog.csdn.net/huyangshu87/article/details/52681478