最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何高效使用Python字典的方法詳解

 更新時間:2017年08月31日 11:24:48   作者:liuzhijun  
Dictionary 是 Python 的內(nèi)置數(shù)據(jù)類型之一,它定義了鍵和值之間一對一的關(guān)系。下面這篇文章主要給大家介紹了關(guān)于如何高效使用Python字典的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。

前言

眾所周知字典(dict)對象是 Python 最常用的數(shù)據(jù)結(jié)構(gòu),社區(qū)曾有人開玩笑地說:"Python企圖用字典裝載整個世界",字典在Python中的重要性不言而喻,這里整理了幾個關(guān)于高效使用字典的清單,希望Python開發(fā)者可以在日常應(yīng)用開發(fā)中合理利用,讓代碼更加 Pythonic。

1、用 in 關(guān)鍵字檢查 key 是否存在

Python之禪中有一條開發(fā)哲學(xué)是:

There should be one-- and preferably only one --obvious way to do it.

盡量找一種,最好是唯一種顯而易見的解決方案。Python2 中判斷某個 key 是否存在字典中可使用 has_key 方法,另外一種方式是使用 in 關(guān)鍵字。但是強(qiáng)烈推薦使用后者,因?yàn)?in 的處理速度更快,另外一個原因是 has_key 這個方法在 Python3 被移除了,要想同時兼容py2和py3兩個版本的代碼,用 in 是最好的選擇。

bad

d = {'name': 'python'}

if d.has_key('name'):
 pass

good

if 'name' in d:
 pass

2、用 get 獲取字典中的值

關(guān)于獲取字典中的值,一種簡單的方式就是用d[x]訪問該元素,但是這種情況在 key 不存在的情況下會報 KeyError 錯誤,當(dāng)然你可以先用 in 操作檢查 key 是否在字典中再獲取,不過這種方式不符合 Python 之禪中說的:

Simple is better than complex.

Flat is better than nested.

好的代碼應(yīng)該是簡單易懂的,扁平的代碼結(jié)構(gòu)更加可讀。我們可以使用 get 方法來代替 if ... else

bad

d = {'name': 'python'}
if 'name' in d:
 print(d['hello'])
else:
 print('default')

good

print(d.get("name", "default"))

3、用 setdefault 為字典中不存在的 key 設(shè)置缺省值

data = [
  ("animal", "bear"),
  ("animal", "duck"),
  ("plant", "cactus"),
  ("vehicle", "speed boat"),
  ("vehicle", "school bus")
 ]

在做分類統(tǒng)計時,希望把同一類型的數(shù)據(jù)歸到字典中的某種類型中,比如上面代碼,把相同類型的事物用列表的形式重新組裝,得到新的字典

groups = {}

>>> 
{'plant': ['cactus'], 
 'animal': ['bear', 'duck'], 
 'vehicle': ['speed boat', 'school bus']}

普通的方式就是先判斷 key 是否已經(jīng)存在,如果不存在則要先用列表對象進(jìn)行初始化,再執(zhí)行后續(xù)操作。而更好的方式就是使用字典中的 setdefault 方法。

bad

for (key, value) in data:
 if key in groups:
  groups[key].append(value)
 else:
  groups[key] = [value]

good

groups = {}
for (key, value) in data:
 groups.setdefault(key, []).append(value)

setdefault 的作用是:

  • 如果 key 存在于字典中,那么直接返回對應(yīng)的值,等效于 get 方法
  • 如果 key 不存在字典中,則會用 setdefault 中的第二個參數(shù)作為該 key 的值,再返回該值。

4、用 defaultdict 初始化字典對象

如果不希望 d[x] 在 x 不存在時報錯,除了在獲取元素時使用 get 方法之外,另外一種方式是用 collections 模塊中的 defaultdict,在初始化字典的時候指定一個函數(shù),其實(shí) defaultdict 是 dict 的子類。

from collections import defaultdict

groups = defaultdict(list)
for (key, value) in data:
 groups[key].append(value)

當(dāng) key 不存在于字典中時,list 函數(shù)將被調(diào)用并返回一個空列表賦值給 d[key],這樣一來,你就不用擔(dān)心調(diào)用 d[k] 會報錯了。

5、用 fromkeys 將列表轉(zhuǎn)換成字典

keys = {'a', 'e', 'i', 'o', 'u' }
value = []
d = dict.fromkeys(keys, value)
print(d)

>>>
{'i': [], 'u': [], 'e': [], 
 'a': [], 'o': []}

6、用字典實(shí)現(xiàn) switch ... case 語句

Python 中沒有 switch ... case 語句,這個問題Python之父龜叔表示這個語法過去沒有,現(xiàn)在沒有,以后也不會有。因?yàn)镻ython簡潔的語法完全可以用 if ... elif 實(shí)現(xiàn)。如果有太多的分支判斷,還可以使用字典來代替。

if arg == 0:
 return 'zero'
elif arg == 1:
 return 'one'
elif arg == 2:
 return "two"
else:
 return "nothing"

good

data = {
 0: "zero",
 1: "one",
 2: "two",
}
data.get(arg, "nothing")

7、使用 iteritems 迭代字典中的元素

python提供了幾種方式迭代字典中的元素,第一種是使用 items 方法:

d = {
 0: "zero",
 1: "one",
 2: "two",
}

for k, v in d.items():
 print(k, v)

items 方法返回的是(key ,value)組成的列表對象,這種方式的弊端是迭代超大字典的時候,內(nèi)存瞬間會擴(kuò)大兩倍,因?yàn)榱斜韺ο髸淮涡园阉性丶虞d到內(nèi)存,更好的方式是使用 iteritems

for k, v in d.iteritems():
 print(k, v)

iteritems 返回的是迭代器對象,迭代器對象具有惰性加載的特性,只有真正需要的時候才生成值,這種方式在迭代過程中不需要額外的內(nèi)存來裝載這些數(shù)據(jù)。注意 Python3 中,只有 items 方法了,它等價于 Python2 中的 iteritems,而 iteritems 這個方法名被移除了。

8、使用字典推導(dǎo)式

推導(dǎo)式是個絕妙的東西,列表推導(dǎo)式一出,map、filter等函數(shù)黯然失色,自 Python2.7以后的版本,此特性擴(kuò)展到了字典和集合身上,構(gòu)建字典對象無需調(diào)用 dict 方法。

bad

numbers = [1,2,3]
d = dict([(number,number*2) for number in numbers])

good

numbers = [1, 2, 3]
d = {number: number * 2 for number in numbers}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python中多繼承與菱形繼承問題的解決方案與實(shí)踐

    Python中多繼承與菱形繼承問題的解決方案與實(shí)踐

    在Python這個靈活且功能強(qiáng)大的編程語言中,多繼承是一個既強(qiáng)大又復(fù)雜的概念,它允許一個類繼承自多個父類,從而能夠復(fù)用多個父類的屬性和方法,本文將深入解釋Python中的多繼承概念,詳細(xì)剖析菱形繼承問題,并探討Python是如何解決這一難題的,需要的朋友可以參考下
    2024-07-07
  • python實(shí)現(xiàn)跨excel的工作表sheet之間的復(fù)制方法

    python實(shí)現(xiàn)跨excel的工作表sheet之間的復(fù)制方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)跨excel的工作表sheet之間的復(fù)制方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python爬蟲控制aiohttp并發(fā)數(shù)量方式

    python爬蟲控制aiohttp并發(fā)數(shù)量方式

    這篇文章主要介紹了python爬蟲控制aiohttp并發(fā)數(shù)量方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 教你用Python讀取CSV文件的5種方式

    教你用Python讀取CSV文件的5種方式

    一個股票的數(shù)據(jù)集,其實(shí)就是常見的表格數(shù)據(jù),有自己的頭部和身體,這篇文章主要介紹了用Python讀取CSV文件的5種方式,通過五招給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 10個Python辦公自動化案例總結(jié)

    10個Python辦公自動化案例總結(jié)

    Python作為一種簡單而強(qiáng)大的編程語言,不僅在數(shù)據(jù)科學(xué)和軟件開發(fā)領(lǐng)域廣受歡迎,還在辦公自動化方面發(fā)揮了巨大作用,通過Python,我們可以編寫腳本來自動執(zhí)行各種重復(fù)性任務(wù),從而提高工作效率并減少錯誤,在本文中,我們總結(jié)了10個Python辦公自動化案例
    2024-09-09
  • Mac中Python 3環(huán)境下安裝scrapy的方法教程

    Mac中Python 3環(huán)境下安裝scrapy的方法教程

    作為一名python爬蟲愛好者,怎能不折騰下Scrapy?折騰了許久之后終于安裝到了mac中,所以下面這篇文章主要給大家介紹了關(guān)于Mac系統(tǒng)中Python 3環(huán)境下安裝scrapy的相關(guān)資料,文中將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-10-10
  • Python:format格式化字符串詳解

    Python:format格式化字符串詳解

    這篇文章主要介紹了Python中用format函數(shù)格式化字符串的用法,格式化字符串是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,本文主要針對Python2.7.x版本,需要的朋友可以參考下
    2021-09-09
  • 淺析python,PyCharm,Anaconda三者之間的關(guān)系

    淺析python,PyCharm,Anaconda三者之間的關(guān)系

    Python是一種跨平臺的計算機(jī)程序設(shè)計語言,簡單來說,python就是類似于C,Java,C++等,一種編程語言。這篇文章主要介紹了淺析python,PyCharm,Anaconda三者之間的關(guān)系,需要的朋友可以參考下
    2019-11-11
  • 利用PyInstaller將python程序.py轉(zhuǎn)為.exe的方法詳解

    利用PyInstaller將python程序.py轉(zhuǎn)為.exe的方法詳解

    這篇文章主要給大家介紹了利用PyInstaller將python程序.py轉(zhuǎn)為.exe的方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Django 過濾器匯總及自定義過濾器使用詳解

    Django 過濾器匯總及自定義過濾器使用詳解

    這篇文章主要介紹了Django 過濾器匯總及自定義過濾器使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07

最新評論

无棣县| 淮北市| 体育| 乌恰县| 巴东县| 博兴县| 石屏县| 凤冈县| 汝阳县| 大石桥市| 榕江县| 无锡市| 绥阳县| 金门县| 高要市| 桃园县| 泉州市| 新巴尔虎右旗| 平度市| 宁安市| 达州市| 大港区| 高碑店市| 嘉义县| 佛学| 吉安市| 东平县| 筠连县| 长白| 海宁市| 来安县| 忻城县| 赤壁市| 金寨县| 太康县| 安义县| 隆德县| 梅州市| 忻州市| 科技| 大关县|