Python 炫技操作 02 合併字典的七種方法

2021-10-04 21:30:19 字數 4916 閱讀 7487

python 炫技操作:條件語句的七種寫法

python 炫技操作:合併字典的七種方法

python 炫技操作:連線列表的八種方法

python 語言裡有許多(而且是越來越多)的高階特性,是 python 發燒友們非常喜歡的。在這些人的眼裡,能夠寫出那些一般開發者看不懂的高階特性,就是高手,就是大神。

但你要知道,在團隊合作裡,炫技是大忌。

為什麼這麼說呢?我說下自己的看法:

越簡潔的**,越清晰的邏輯,就越不容易出錯;

在團隊合作中,你的**不只有你在維護,降低別人的閱讀/理解**邏輯的成本是乙個良好的品德

簡單的**,只會用到最基本的語法糖,複雜的高階特性,會有更多的依賴(如語言的版本)

該篇是「炫技系列」的第二篇內容,在這個系列裡,我將總結盤點一下,我所見過的那些炫技操作。在這裡,如果你是 python 發燒友,你可以學到一些寫出超酷的**書寫技巧。同時,看了這些內容,對你在閱讀別人的**時,也許會有些幫助。

字典物件內建了乙個 update 方法,用於把另乙個字典更新到自己身上。

>>

> profile =

>>

> ext_info =

>>

>

>>

> profile.update(ext_info)

>>

>

print

(profile)

如果想使用 update 這種最簡單、最地道原生的方法,但又不想更新到自己身上,而是生成乙個新的物件,那請使用深拷貝。

>>

> profile =

>>

> ext_info =

>>

>

>>

>

from copy import deepcopy

>>

>

>>

> full_profile = deepcopy(profile)

>>

> full_profile.update(ext_info)

>>

>

>>

>

print

(full_profile)

>>

>

print

(profile)

使用**可以解包字典,解包完後再使用 dict 或者{}就可以合併。

>>

> profile =

>>

> ext_info =

>>

>

>>

> full_profile01 =

>>

>

print

(full_profile01)

>>

>

>>

> full_profile02 =

dict

(**profile,

**ext_info)

>>

>

print

(full_profile02)

若你不知道dict(**profile, **ext_info)做了啥,你可以將它等價於

>>

>

dict((

("name"

,"xiaoming"),

("age",27

),("gender"

,"male"))

)

在 python 裡有乙個非常強大的內建模組,它專門用於操作可迭代物件。

正好我們字典也是可迭代物件,自然就可以想到,可以使用itertools.chain()函式先將多個字典(可迭代物件)串聯起來,組成乙個更大的可迭代物件,然後再使用 dict 轉成字典。

>>

>

import itertools

>>

>

>>

> profile =

>>

> ext_info =

>>

>

>>

>

>>

>

dict

(itertools.chain(profile.items(

), ext_info.items())

)

如果可以引入乙個輔助包,那我就再提乙個,chainmap也可以達到和itertools同樣的效果。

>>

>

from collections import chainmap

>>

>

>>

> profile =

>>

> ext_info =

>>

>

>>

>

dict

(chainmap(profile, ext_info)

)

使用 chainmap 有一點需要注意,當字典間有重複的鍵時,只會取第乙個值,排在後面的鍵值並不會更新掉前面的(使用 itertools 就不會有這個問題)。

>>

>

from collections import chainmap

>>

>

>>

> profile =

>>

> ext_info=

>>

>

dict

(chainmap(profile, ext_info)

)

在 python 3.9 之前,其實就已經有|操作符了,只不過它通常用於對集合(set)取並集。

利用這一點,也可以將它用於字典的合併,只不過得繞個彎子,有點不好理解。

你得先利用items方法將 dict 轉成 dict_items,再對這兩個 dict_items 取並集,最後利用 dict 函式,轉成字典。

>>

> profile =

>>

> ext_info =

>>

>

>>

> full_profile =

dict

(profile.items(

)| ext_info.items())

>>

> full_profile

當然了,你如果嫌這樣太麻煩,也可以簡單點,直接使用 list 函式再合併(示例為 python 3.x )

>>

> profile =

>>

> ext_info =

>>

>

>>

>

dict

(list

(profile.items())

+list

(ext_info.items())

)

若你在 python 2.x 下,可以直接省去 list 函式。

>>

> profile =

>>

> ext_info =

>>

>

>>

>

dict

(profile.items(

)+ ext_info.items())

python 裡對於生成列表、集合、字典,有一套非常 pythonnic 的寫法。

那就是列表解析式,集合解析式和字典解析式,通常是 python 發燒友的最愛,那麼今天的主題:字典合併,字典解析式還能否勝任呢?

當然可以,具體示例**如下:

>>

> profile =

>>

> ext_info =

>>

>

>>

>

在 2 月份發布的 python 3.9.04a 版本中,新增了乙個抓眼球的新操作符操作符:|, pep584 將它稱之為合併操作符(union operator),用它可以很直觀地合併多個字典。

>>

> profile =

>>

> ext_info =

>>

>

>>

> profile | ext_info

>>

>

>>

> ext_info | profile

>>

>

>>

>

除了|操作符之外,還有另外乙個操作符|=,類似於原地更新。

>>

> ext_info |

= profile

>>

> ext_info

>>

>

>>

>

>>

> profile |

= ext_info

>>

> profile

看到這裡,有沒有漲姿勢了,學了這麼久的 python ,沒想到合併字典還有這麼多的方法。本篇文章的主旨,並不在於讓你全部掌握這 7 種合併字典的方法,實際在工作中,你只要選用一種最順手的方式即可,但是在協同工作中,或者在閱讀他人**時,你不可避免地會碰到各式各樣的寫法,這時候你能下意識的知道這是在做合併字典的操作,那這篇文章就是有意義的。

Python 炫技操作 連線列表的八種方法

python 語言裡有許多 而且是越來越多 的高階特性,是 python 發燒友們非常喜歡的。在這些人的眼裡,能夠寫出那些一般開發者看不懂的高階特性,就是高手,就是大神。但你要知道,在團隊合作裡,炫技是大忌。為什麼這麼說呢?我說下自己的看法 越簡潔的 越清晰的邏輯,就越不容易出錯 在團隊合作中,你的...

Python 炫技操作 連線列表的八種方法

python 語言裡有許多 而且是越來越多 的高階特性,是 python 發燒友們非常喜歡的。在這些人的眼裡,能夠寫出那些一般開發者看不懂的高階特性,就是高手,就是大神。但你要知道,在團隊合作裡,炫技是大忌。為什麼這麼說呢?我說下自己的看法 越簡潔的 越清晰的邏輯,就越不容易出錯 在團隊合作中,你的...

python筆記02 字串操作

str1 www str1就是字串了 一定用引號 或者直接使用 字串.來呼叫內部的方法 capitalize 方法 開頭大寫 print wsy www capitalize wsy www swapcase 方法 全都大寫 print wsy ada swapcase wsy ada isuppe...