python之字典、字典追加

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章