巧克力與雨林共生 亞馬遜部落重返「可可之地」 靠它驅逐非法淘金

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

Convolutional Sequence to Sequence Learning 論文筆記

目錄

簡介

寫這篇博客主要是為了進一步了解如何將CNN當作Encoder結構來使用,同時這篇論文也是必看的論文之一。該論文證明了使用CNN作為特徵抽取結構實現Seq2Seq,可以達到與 RNN 相接近甚至更好的效果,並且CNN的高并行能力能夠大大減少我們的模型訓練時間(本文對原文中不清晰的部分做了梳理,建議與原文搭配服用)

原文鏈接:

模型結構如下圖所示:

下面對模型的每個部分進行分塊介紹:

Position Embeddings

卷積網絡和Transformer一樣,不是類似於RNN的時序模型,因此需要加入位置編碼來體現詞與詞之間的位置關係

  • 樣本輸入的詞向量:\(w = (w_1, w_2, …, w_n)\)
  • 樣本位置編碼:\(p = (p_1, p_2, …, p_n)\)
  • 最終詞向量表徵:\(e = (w_1 + p_1, w_2 + p_2, …, w_n + p_n)\)

GLU or GRU

GLU和GTU是在同一篇論文中提出的,其中,GLU也是CNN Seq2Seq的主要結構。可以直接將其當作激活函數來看待,其將某以卷積核的輸出輸入到兩個結構相同的卷積網絡,令其中一個的輸出為\(A\),另一個為\(B\)
GLU與GRU的區別就在於A輸出的激活函數不同:
\[GLU:H_0=A \otimes \sigma (B)\]

\[GTU:H_0=tanh(A) \otimes \sigma (B)\]

而CNN Seq2Seq就採用了GLU作為模型的激活函數

原文鏈接:

Convolutional Block Structure

編碼器與解碼器都是由多個卷積層構成的(原文中稱為block,實際上就是layer),每一層包含一個1維卷積核以及一個門控線性單元(Gated linear units, GLU)。假設單詞數即輸入長度為\(m\),kernel大小為\(k\),pad為\(p\),那麼計算輸出sequence長度的公式為\((m+2p-k)/stride+1\),只要適當的設置卷積核的kernel大小、pad以及步長參數,即可使得輸出序列與輸入序列的維度保持一致。在文中,輸入為25,kernel為5,則輸出序列長度為\((25+2*2-5)/1+1=25\)

另外,為了充分讓輸出節點跟整個sequence單詞有聯繫,必須使用多個卷積層,這樣才能使得最後一個卷積核有足夠大得感受野以感受整個句子的特徵,同時也能捕捉局部句子的特徵。

來看一下整個編碼器的前向傳播方式:

  • 每次輸入到卷積核的句子的大小為\(X \in R^{k\times d}\),表明每次卷積核能夠讀取的序列長度為\(k\),也就是卷積核的寬度為\(k\),詞向量維度為\(d\)
  • 卷積核的權重矩陣大小為\(W^{2d \times k \times d}\),偏置向量為\(b_W \in R^{2d}\),表明每一層有\(2d\)個卷積核,因此輸出序列的維度為\(2d\),而由於事先的設計,使得輸入序列與輸出序列的長度是相同的,因此經過卷積之後,得到的序列的矩陣大小為\(Y \in R^{k \times 2d}\)
  • 我們將上面的\(2d\)個卷積核分為兩個部分,這兩個部分的卷積核尺寸與個數完全相同,輸出維度也完全相同,則可以將其當作\(GLU\)的兩個輸入,輸入到GLU整合過後,輸出的序列維度又變為了\(\hat{Y} \in R^{k \times d}\)
  • 為了能夠實現深層次的網絡,在每一層的輸入和輸出之間採用了殘差結構
  • 對於解碼序列來說,我們需要提取解碼序列的隱藏表徵,但是解碼序列的解碼過程是時序遞歸的,即我們無法觀測到當前預測對象之後的序列,因此論文作者將輸入的decoder序列

這樣的卷積策略保證了每一層的輸入與輸出序列的一一對應,並且能夠將其看作簡單的編碼器單元,多層堆疊以實現更深層次的編碼。

Multi-step Attention

對於Attention的計算,關鍵就是找到 Query、Key 和 Value。下圖為計算Attention且解碼的示意圖

Attention的計算過程如下:

  • Query由decoder的最後一個卷積層的輸出\(h_i^l\)以及上一時刻decoder最終的生成的目標\(g_i\)共同決定,\(W^l_d\)\(b_d^l\)為線性映射的參數。
    \[d_i^l = W^l_dh^l_i+b_d^l+g_i\]

  • Key 則採用 Encoder 的輸出\(z_j^u\),典型的二維匹配模型,將 Query 與 Key 一一對齊,計算 dot attention分數:
    \[a_{ij}^l = \frac{exp(d^l_i \cdot z^u_j)}{\sum_{t=1}^mexp(z_j^u+e_j)}\]

  • Value 的值則取編碼器的輸出\(z_j^u\)以及詞向量表徵\(e_j\)之和,目的是為編碼器的輸出加上位置表徵信息。得到對應的 Value 值 \(c_i^l\) 之後,直接與當前時刻的 Decoder 輸出 \(h_i^l\) 相加,再輸入分類器進行分類。
    \[c_i^l = \sum_{j=1}^ma_{ij}^l(z_j^u + e_j)\]

Normalization Strategy

模型還通過歸一化策略來保證通過每一層模型的方差變化不會太大,這裏先簡單的記錄一下,具體的操作細節需要回去仔細琢磨代碼。歸一化的主要策略如下:

  • 對殘差網絡的輸入和輸出乘以 \(\sqrt{0.5}\) 來保證輸入和輸出的方差減半(這假設兩側的方差是相等的,雖然這不是總是正確的,但是實驗證明這樣做是有效的)
  • 由於注意力模塊的輸出向量為 m 個向量的加權和,因此將其乘以 \(m \sqrt{m}\) 來抵消方差的變化,其中,乘以 \(m\) 是為了將向量放大到原始的大小(實際中通常不會這麼做,但是這麼做的效果良好)
  • 由於採用了多重注意力機制的卷積解碼器,作者根據注意力機制的數量來對反向傳播到編碼器的梯度進行壓縮,這可以避免編碼器接收過多的梯度信息,使得訓練變得更加平穩。

Initialization

初始化的目的與歸一化是一致的,即都是為了保證前向與後項傳播的數據方差能夠保持在一個較穩定的水準,模型初始化的策略如下:

  • 此前如層都由平均值為0以及標準差為0.1的正太分佈進行初始化。
  • 對於其輸出未直接輸入門控線性單元的層,我們以正態分佈 \(N(0, \sqrt{1/n_l})\) 來初始化權重,其中 \(n_l\) 是每個神經元的輸入連接個數。 這樣可以確保正太分佈的輸入的方差得以保留
  • 對於輸出與GLU相連的層,我們採取不同的策略。如果GLU的輸入的均值為0且方差足夠小,則輸出方差可以近似等於輸入方差的1/4。 因此,需要初始化權重使得GLU激活的輸入具有該層輸入方差的4倍,即該層的初始化分佈為 \(N(0, \sqrt{4/n_l})\)
  • 此外,每一層的偏置 \(b\) 統一設置為0
  • 另外,考慮到 dropout 也會影響數據的方差分佈,假設dropout的保留概率為p,則方差將放大為 \(1/p\) 倍,因此上述提到的初始化策略需要修正為: \(N(0, \sqrt{p/n_l})\) 以及 \(N(0, \sqrt{4p/n_l})\)

最後的實驗部分就不記錄了,有興趣的同學可以去原文里看看。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

做程序員的一些偏見

“人類的心靈有一種神奇的能力,它能夠感知到別人的虛情假意。如果銷售人員的暗示是一種虛情假意的產物,那麼幾乎刻意肯定的是,這種暗示在客戶心中產生的結果也不會是一種真實的情感。”

                                                                ——諾瓦爾·霍金斯

前天,銷售同事老吳還說,做銷售一定要講人品,而且做人很重要。我很贊同他的觀點,但我還是對他的觀點做了補充:不單單是銷售要學會做人,我們任何一個崗位、任何一個人都要學會如何做人。崗位是做事層面,做人是做事的根基,無論你是銷售還是程序員、都離不開做人。我在部門裡經常對同事們說,甚至在面試的時候也跟應聘者強調,我們都是全民銷售。因為我們扁平化的開放管理制度,我們任何一個員工都有可能直接面對客戶。作為服務行業的我們,任何一個同事的印象以及專業態度都是我們的招牌。面對客戶就是面對市場,面對市場的員工就是覆蓋了銷售的角色。我們每個人都代表着一個企業,更代表了自己。有些客戶可能因為我們需求做得好,所以給了我更多的機會;也有可能有些客戶因為我們的美工同事洞悉到了客戶的需求而用真誠的設計打動了客戶,贏下了訂單;甚至可能是我們善良、踏實、勤奮的程序員同事感動了客戶,非要跟我們合作不可。這裏都包含着公司的文化和個人的修養。

 

我過去一直深受着各種流言的毒害,當然,我不會把問題丟給環境,真正的問題在於自己沒有足夠的獨立思考和判斷能力。別人說程序員普遍悶騷,別人說美工都很藝術,還有人說需求就是要有足夠的健談和洞察能力。其實,話有時候並沒有毛病,但我們缺少一個宏觀與高度的視野能力會很容易讓自己“入戲”,也就是會以偏概全。就像同事老吳說銷售考驗做人,如果我弱一點,我真會以為作為程序員的自己就沒那麼需要關注做人層面了,反正自己不用天天面對客戶。這就是我們常說的短見。

 

我現在的職位寫着是部門經理,不止戰略,在戰術上如架構、設計、開發我都一直在做,還帶着近80號人。我目前的狀態不是因為我踩正了職業規劃路線,或者我有管理的能力。而是我看不過眼和忍受不了之前團隊的低效和散漫,想自己做得有成就一點,有效率一點而已。沒人敢這麼做,而領導敢給我這樣一個機會,那就只有我自己扛起大旗向前沖了。有時候,當自己真覺得環境待不下去了,可能就是自己的機會。我不知道自己有沒有這個能力,但我有一個看清問題本質的視野和敢說敢做勇氣。個人發展的本質並不是職位驅動的,任何一個有能力的人都能有機會上升,不管你是美工、測試、需求還是程序員,就看自己願不願意放開自己思維和勇氣。我很早就已經說過,職位在做事面前都是一文不值。千萬不要被各種所謂的管理晉陞路線和技術大咖晉陞路線給誤導。人生都是問題驅動的,每個人的起點都不一樣,問題也都不一樣。多把視野放在當前問題身上,而不是帶着別人給出的規劃建議去逃避自己當前的問題,這個同事不好,那個老闆不行,這都不是自己想要的,這都是借口。能讓自己過得好,能讓家人過得好才是王道。所以,從這個角度看,無論什麼職位,跑得越高,越是辛苦。認識不了這個本質的,永遠做不了高層。

 

我們一出生就已經內置了銷售這個職位,我們需要與人打交道,我們需要結交朋友,我們需要面試找工作等等。其實,我們無時無刻在銷售着自己。而真誠就是我們每一個都需要具備的銷售品質。做銷售的門檻很低,可是考驗很大,但前途也無可限量。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

希臘擬建水上圍牆 恐增移民罹難機率

苦勞網2020年2月3日報導;陳韋綸編譯

為了阻止更多移民自土耳其前來,,此舉引發人道組織的抨擊,認為將增加庇護尋求者與難民途中遭遇的危險,反對派也稱計畫「愚蠢」,更不可能阻止移民。

希臘政府預計在愛琴海北部的勒斯博島(Lesbos)設置長達2.7公里的網狀屏障,屏障將高於海平面50公分,費用約為50萬歐元(約新台幣1,680萬元)。勒斯博島上的摩利亞(Moria)難民營,是希臘主要的難民接待中心,原本僅能容納3千人的難民營,如今卻擠滿1萬9千人,環境惡劣,。

「遊戲規則已經改變!」掌管移民與難民事務的部長米塔拉希斯(Notis Mitarakis)嚴詞宣告:希臘不是想來就來的地方,「我們將採取一切措施保護邊境」,甚至揚言將加速驅逐出境的流程。

去年共計7萬2千人抵達希臘,米塔拉希斯表示,今年1月起,只要不符合難民資格的人,幾個月內便會被遣返土耳其。對於一百多萬民因戰爭逃離敘利亞的難民而言,希臘是進入歐盟的閘門,與希臘僅有愛琴海之隔的土耳其,已收容4百多萬名敘利亞難民,人數是世界之最。

國際特赦組織(AI)批評,此計畫不但增加庇護尋求者與難民上岸的難度,也嚴重影響救援者的協助工作,要求政府採取必要的安全措施,確保這套系統不會造成更多人犧牲。,而且難以實現。「即便是孩子都知道,海上建牆是不可能的。」

※轉載自()

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

法國通過反浪費法 禁丟棄未售出商品

2020年2月3日苦勞網報導;陳韋綸編譯

繼禁止超商丟棄未售出食物後,,禁止服飾與精品公司摧毀未售出的商品,不過卻被批評缺乏罰則而難有成效。

共130項條文的《反浪費與經濟流通法案》,要求製造、進口與批發商,其中也包括亞馬遜(Amazon)等線上零售商,捐贈未出售的貨物,商品範圍涵蓋電子產品、衛生用品與化妝品。此外,該法案也希望2025年前回收所有塑膠製品,並將一次性塑膠瓶的使用減少一半。速食餐廳則須在2023年前停止使用塑膠容器。

總理菲力普(Édouard Philippe)表示,在法國,每年未使用卻被丟棄的消費產品高達6億5千萬歐元(約新台幣217億元)。根據「污染者付費」原則,企業也須為自己製造的廢棄物付費,例如菸草製造商必須在隔年支付處理煙蒂的費用。

在法國,。當初推動立法要求超商捐贈過期食物的德朗巴斯(Arash Derambarsh)表示,新法雖然立意良善,但是缺乏誠意,「如果沒有罰則,人們只會忽略法律」,導致新法難有成效。

※轉載自()

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

真的賣不好 美農藥巨頭決定停產陶斯松 川普駁回禁令也徒勞

環境資訊中心綜合外電;鄒敏惠編譯、許芷榕審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

世界最大廢水養殖系統在印度 濕地淨化勝過污水處理廠 仍不敵政府開發

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

全棧項目|小書架|服務器開發-JWT 詳解

JWT

文章基本是官網內容的翻譯,英文不錯的同學可點擊上面的鏈接直接看英文文檔。

什麼是 JWT

JWT全稱是JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且自包含的方式,用於在各方之間作為JSON對象安全地傳輸信息。由於此信息是經過数字簽名的,因此可以被驗證和信任。

可以使用密鑰(HMAC算法)或使用RSAECDSA的公用/專用密鑰對對JWT進行簽名。

什麼時候使用 JWT 驗證

  • 授權(Authorization)
    這是使用JWT的最常見情況。一旦用戶登錄,每個後續請求將包括JWT,從而允許用戶訪問該令牌允許的路由,服務和資源。單一登錄是當今廣泛使用JWT的一項功能,因為它的開銷很小並且可以在不同的域中輕鬆使用。
  • 信息交換(Information Exchange)
    JWT是在各方之間安全地傳輸信息的好方法。因為可以對JWT進行簽名(例如,使用公鑰/私鑰對),所以您可以確保發件人是他們所說的人。另外,由於簽名是使用Headerpayload計算的,因此您還可以驗證內容是否未被篡改。

JWT 的結構格式

由三部分組成,這些部分由點.分隔,分別是:

  • Header
  • Payload
  • Signature

因此,JWT通常如下所示。

xxxxx.yyyyy.zzzzz

Header

通常由兩部分組成:

  • 令牌的類型(即JWT
  • 所使用的簽名算法,例如: 或。

例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

然後,將此JSON通過Base64Url編碼以形成JWT的第一部分。

Payload

令牌的第二部分是有效負載,其中包含聲明。聲明是有關實體(通常是用戶)和其他數據的聲明。共有三種類型的索賠: registered、public、private claims

  • Registered claims
    這些是一組預定義的權利要求,不是強制性的,而是建議使用的,以提供一組有用的可互操作的權利要求。其中一些是:iss(發出者),exp(到期時間),sub(主題),aud(受眾) 等。
    Tip: 請注意,聲明名稱僅是三個字符,因為JWT是緊湊的。
  • Public claims
    這些可以由使用JWT的人員隨意定義。但是為避免衝突,應在IANA JSON Web令牌註冊表中定義它們,或將其定義為包含抗衝突名稱空間的URI
  • Private claims
    這些是自定義聲明,旨在在同意使用它們的各方之間共享信息,既不是註冊聲明也不是公共聲明。

有效負載示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

同樣需要Base64Url編碼,以形成JWT的第二部分。

Signature

簽名(Signature)用於驗證消息在整個過程中沒有更改,並且對於使用私鑰進行簽名的令牌,它還可以驗證JWT的發送者是它所說的真實身份。

例如,如果要使用HMAC SHA256算法,則將通過以下方式創建簽名:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

將這三部分合併

輸出是三個由.分隔的Base64-URL字符串,可以在HTMLHTTP環境中輕鬆傳遞這些字符串,與基於XML的標準(例如SAML)相比,它更緊湊。

下圖显示了一個JWT,它已對先前的HeaderPayload進行了編碼,並用一個Signature

可以在這個網頁 驗證和生成JWT

JWT 如何工作

在身份驗證中,當用戶使用其憑據成功登錄時,將返回令牌。由於令牌是憑據,因此必須格外小心以防止安全問題。通常,令牌的有效時間不宜設置過長。

Tip: 由於缺乏安全性,您也不應該將敏感的會話數據存儲在瀏覽器存儲中。

每當用戶想要訪問受保護的路由或資源時,用戶代理通常應在Bearer模式中使用授權頭髮送JWTHeader的內容應如下所示:

Authorization: Bearer <token>

在某些情況下,接口訪問並不需要身份授權。服務器的受保護路由將在Authorization Header中檢查JWT令牌是否有效,如果存在且有效,則將允許用戶訪問受保護的資源。

如果JWT包含必要的數據,則可以減少查詢數據庫中某些操作的需求。

如果令牌是在Authorization Header中發送的,則跨域資源共享 不會成為問題,因為它不使用cookie

下圖显示了如何獲取JWT並將其用於訪問API或資源

  1. 應用程序或客戶端向授權服務器請求授權。生產JWT令牌
  2. 授予授權后,授權服務器會將訪問令牌返回給應用程序。
  3. 應用程序使用訪問令牌來訪問受保護的資源(例如API)。
  4. 服務器檢查JWT令牌是否有效,返回對應結果給客戶端

下圖詳細的流程:

ps:請注意,使用簽名令牌,令牌或令牌中包含的所有信息都會暴露給用戶或其他方,即使他們無法更改它。這意味着您不應將機密信息放入令牌中。

為什麼需要 JWT

對比 Simple Web Tokens (SWT)Security Assertion Markup Language Tokens (SAML),看看使用JSON Web Tokens (JWT) 有什麼好處。

  • 由於JSON不如XML冗長,因此在編碼時JSON的大小也較小,從而使JWTSAML更緊湊。這使得JWT是在HTMLHTTP環境中傳遞的不錯的選擇。
  • 在安全方面,SWT只能使用HMAC算法進行對稱簽名。但是JWTSAML令牌可以使用X.509證書形式的公用/專用密鑰對進行簽名。與簽名JSON的簡單性相比,使用XML Digital Signature簽名XML而不引入模糊的安全漏洞是非常困難的。
  • JSON解析器在大多數編程語言中都很常見,因為它們直接映射到對象。相反,XML沒有自然的文檔到對象映射。與SAML斷言相比,這使使用JWT更加容易。
  • 關於用法,JWT是在Internet規模上使用的。這強調了在多個平台(尤其是移動平台)上對JSON Web令牌進行客戶端處理的簡便性。

如果您想了解有關JSON Web令牌的更多信息,甚至開始使用它們在自己的應用程序中執行身份驗證,請瀏覽到 頁面。

諮詢請加微信:輕撩即可。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

Python字典 你必須知道的用法系列

本文Python版本為3.7.X,閱讀本文之前需了解python字典的基本用法。

介紹

字典(dict)是Python中內置的一個數據結構,由多個鍵值對組成,鍵(key)和值(value)用冒號分隔,每個鍵值對之間用逗號(,)分隔,整個字典包括在大括號中({}),鍵必須是唯一的,值可以取任何類型,但是鍵必須是不可變類型,如字符串,数字或元組。

底層使用了hash表來關聯key和value,dict是無序的。特點包括:

  1. 查找和插入的速度極快,不會隨着key的增加而變慢;
  2. 需要佔用的內存較多

所以,dict是一種以空間換取時間的數據結構,應用於需要快速查找的場景。

操作

常用方法

get()

返回指定鍵的值,如果key不存在,則返回默認值(默認為None),而不會報錯,語法為dict.get(key)。

dict_1['age'] = 24

In [7]: print(dict_1.get('age'))
24

In [11]: print(dict_1.get('nama'))
None

In [12]: print(dict_1['nama'])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-12-ef61a380920e> in <module>
----> 1 print(dict_1['nama'])

KeyError: 'nama'

key in dict

使用in操作符來判斷鍵是否存在於字典中,存在則返回True,否則返回False,語法為:key in dict。

In [15]: dict_1
Out[15]: {'name': None, 'age': 24, 'sex': None}

In [16]: print('name' in dict_1)
True

In [17]: print('nama' in dict_1)
False

在python 2中該功能使用has_key()方法實現。

items()

以列表形式返回可遍歷的(鍵, 值)元組數組,語法為dict.items()。

In [18]: dict_1
Out[18]: {'name': None, 'age': 24, 'sex': None}

In [19]: print(dict_1.items())
dict_items([('name', None), ('age', 24), ('sex', None)])

In [20]: for key, value in dict_1.items():
    ...:     print(key, value)
    ...:
name None
age 24
sex None

keys()

以列表返回一個字典的所有鍵:dict.keys()

In [21]: dict_1
Out[21]: {'name': None, 'age': 24, 'sex': None}

In [22]: print(dict_1.keys())
dict_keys(['name', 'age', 'sex'])

values()

以列表形式返回字典中的所有值:dict.values()

In [27]: dict_1
Out[27]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'}

In [28]: print(dict_1.values())
dict_values([None, 24, None, 'Tony'])

setdefault()

和get()類似,用戶獲得與給頂尖相關聯的值,不同的是,該方法如果鍵不存在時會添加鍵並將值設為默認值,語法為:dict.setdefault(key, default=None)。

In [23]: dict_1
Out[23]: {'name': None, 'age': 24, 'sex': None}

In [24]: print(dict_1.setdefault('name'))
None

In [25]: print(dict_1.setdefault('name', 'Tony'))
None

In [26]: print(dict_1.setdefault('sub_name', 'Tony'))
Tony

In [27]: dict_1
Out[27]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'}

update()

語法為:dict_1.update(dict_2),用於把dict_2的鍵值對更新到dict_1中,如果有相同的鍵會被覆蓋。

In [31]: dict_1
Out[31]: {'name': None, 'age': 24, 'sex': None, 'sub_name': 'Tony'}

In [32]: dict_2
Out[32]: {'name': 'Mary', 'age': 18, 'sex': None, 'sub_name': ''}

In [33]: dict_1.update(dict_2)

In [34]: dict_1
Out[34]: {'name': 'Mary', 'age': 18, 'sex': None, 'sub_name': ''}

clear()

刪除字典中的所有項,dict.clear(),舉個例子:

In [1]: dict_1 = dict(name="Tony", age=24)

In [2]: dict_2 = dict_1

In [3]: print(dict_2)
{'name': 'Tony', 'age': 24}

In [4]: dict_2.clear()

In [5]: dict_2
Out[5]: {}

In [6]: dict_1
Out[6]: {}

copy()

淺拷貝原始字典,返回一個具有相同鍵值對的新字典,dict.copy(),舉個例子:

In [1]: dict_1 = dict(name='Tony', info=['boy', 24])

In [2]: dict_3 = dict_1.copy()

In [3]: dict_3['name'] = "Ring"

In [4]: dict_3['info'].remove('boy')

In [5]: dict_3
Out[5]: {'name': 'Ring', 'info': [24]}

In [6]: dict_1
Out[6]: {'name': 'Tony', 'info': [24]}

fromkeys()

創建一個新字典,dict.fromkeys(seq[, value]),以序列seq中的元素做字典的鍵,value為字典所有鍵對應的初始值,其中value為可選參數, 默認為None。適用於數據初始化,舉個例子:

In [1]: info = ['name', 'age', 'sex']

In [2]: dict_1 = dict.fromkeys(info)

In [3]: dict_1
Out[3]: {'name': None, 'age': None, 'sex': None}

常見操作

合併字典

有四種方式:

  1. 常規處理
In [15]: dict_1
Out[15]: {'Tony': 24}

In [16]: dict_2
Out[16]: {'ben': 18}

In [17]: dict3 = dict()

In [18]: for key, value in dict_1.items():
    ...:     dict_3[key] = value
    ...:

In [19]: for key, value in dict_2.items():
    ...:     dict_3[key] = value
    ...:

In [20]: dict_3
Out[20]: {'Tony': 24, 'ben': 18}
  1. update()
In [9]: dict_1
Out[9]: {'Tony': 24}

In [10]: dict_2
Out[10]: {'ben': 18}

In [12]: dict_3 = dict_1.copy()

In [13]: dict_3.update(dict_2)

In [14]: dict_3
Out[14]: {'Tony': 24, 'ben': 18}
  1. 藉助字典的dict(d1, **d2)方法
In [33]: dict_1
Out[33]: {'Tony': 24}

In [34]: dict_2
Out[34]: {'ben': 18}

In [35]: dict_3 = dict(dict_1, **dict_2)

In [36]: dict_3
Out[36]: {'Tony': 24, 'ben': 18}

進階

字典推導式

和列表推導式類似,優點是底層用C實現,會快很多,推薦使用。

對換字典的鍵值

使用字典推導式可以輕鬆對換一個字典的鍵值:

In [42]: dict_4
Out[42]: {24: 'Tony', 18: 'ben'}

In [43]: dict_3
Out[43]: {'Tony': 24, 'ben': 18}

In [44]: dict_4 = {k:v for v, k in dict_3.items()}

In [45]: dict_4
Out[45]: {24: 'Tony', 18: 'ben'}

從字典中提取子集

想創建一個字典,其本身是另一個字典的子集。

舉個例子:

In [88]: a = {'Ben': 18, 'Jack': 12, 'Ring': 23, 'Tony': 24}

In [89]: b = {k:v for k, v in a.items() if v > 18}

In [90]: b
Out[90]: {'Ring': 23, 'Tony': 24}

生成有序字典

在Python3.6之前的字典是無序的,但是有時候我們需要保持字典的有序性,orderDict可以在dict的基礎上實現字典的有序性,這裏的有序指的是按照字典key插入的順序來排列,這樣就實現了一個先進先出的dict,當容量超出限制時,先刪除最早添加的key。
舉例:

In [49]: from collections import OrderedDict

In [50]: ordered_dict = OrderedDict([('a', 2), ('b', 4), ('c', 5)])

In [51]: for key, value in ordered_dict.items():
    ...:     print(key, value)
    ...:
a 2
b 4
c 5

可以看到OrderedDict是按照字典創建時的插入順序來排序。

原理:OrderedDict內部維護了一個雙向鏈表,它會根據元素加入的順序來排列鍵的位置,這也就導致OrderedDict的大小是普通字典的2倍多。

合併列表中key相同的字典

也就是生成所謂的一鍵多值字典,需要將對應的多個值保存在其它容器比如列表或集合,取決於多值是否需要保證唯一性。

舉個例子:

In [64]: from collections import defaultdict

In [65]: a = [{'a': 1}, {'b': 3}, {'c': 4}, {'a':5}, {'b':2}, {'b': 4}]

In [66]: b = defaultdict(list)

In [67]: [b[k].append(v) for item in a for k, v in item.items()]
Out[67]: [None, None, None, None, None, None]

In [68]: b
Out[68]: defaultdict(list, {'a': [1, 5], 'b': [3, 2, 4], 'c': [4]})

In [69]: b['a']
Out[69]: [1, 5]

尋找兩個字典的異同

場景:尋找兩個字典中的異同,包括相同的鍵或者相同的值。

分析:字典是一系列鍵值之間的映射集合,有以下特點:

  1. keys()會返回字典中的所有鍵,並且字典的鍵是支持集合操作的,所以利用集合的交叉並補即可對字典的鍵進行處理;
  2. items()返回(key, value)組成的對象,支持集合操作;
  3. values()並不支持集合操作,因為並不能保證所有的值是唯一的,但是如果必須要判斷操作,可以先將值轉化為集合來實現。

舉例:

In [78]: a = {'a':1, 'b':2, 'c':3}

In [79]: b = {'b':3, 'c':3, 'd':4}

In [80]: a.keys() & b.keys()
Out[80]: {'b', 'c'}

In [81]: a.keys() - b.keys()
Out[81]: {'a'}

In [82]: a.items() & b.items()
Out[82]: {('c', 3)}

再舉一個例子,在創建一個字典時,期望可以去除某些鍵:

In [85]: a
Out[85]: {'a': 1, 'b': 2, 'c': 3}

In [86]: c = {k: a[key] for k in a.keys() - {'b'}}

In [87]: c
Out[87]: {'a': 3, 'c': 3}

以上。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

紅毛猩猩家園不保 印尼水壩爭議 凸顯聯合國碳排放計算漏洞

環境資訊中心綜合外電;黃鈺婷 翻譯;彭瑞祥 審校;稿源:Mongabay

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開