[精讚] [會員登入]
863

【Python3】11 - 字典(Dictionary)的使用範例

python3的幾個字典使用範例,改寫自他人perl的範例

分享此文連結 //n.sfs.tw/15429

分享連結 【Python3】11 - 字典(Dictionary)的使用範例@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-03-25 21:44:40 最後編修
2021-10-09 12:32:17 By 過路君子
 

大家好,這裡是翻譯了其他程式語言的小編過路君子

事實上還滿好玩的,看看其他的程式語言有哪些以前從來沒看過的語法,處處都有驚喜。

 

 

以下的文章內容基本上參考了這一篇 [PERL] 11- 雜湊的範例@新精讚,只是將其使用 perl的部分改用 python3來表達,而且已經向原作者取得改寫、再發佈許可。

所以找不到其他關於 python3其他編號的文章很正常,因為目前只有改寫這一篇,有興趣的人可以比對兩篇文章裡程式的寫法。

 

範例一、計算文字出現次數

計算一段字串中各字出現的次數,因為 python3本身是採 unicode編碼方式,所以不管是中文、英文乃至於日文 python3都可以輕鬆的處理完畢。

text = """石室詩士施氏,嗜獅,誓食十獅
施氏時時適市視獅
十時,適十獅適市
是時,適施氏適市
氏視是十獅,恃矢勢,使是十獅逝世
氏拾是十獅屍,適石室
石室濕,氏使侍拭石室
石室拭,氏始試食是十獅
食時,始識是十獅,實十石獅屍
試釋是事"""

word = {}
for x in text:
    if x in word.keys(): word[x] += 1
    else: word[x] = 1

for key, value in word.items(): print(f"{key}, {value}")
第 1~10行 先將我們等等需要分析的字串初始化完畢,此處使用了 python的 """格式,使用 """"所儲存的字串會連同 \n或 \t也一同儲存起來。
第 12行 初始化一個名為 word的空字典。
第 13~15行 依序開始尋訪 text裡的每一個文字(包括 \n),如果該單字已經是 word裡的其中一個鍵,則將其值遞增一;反之,將其添加進 word的鍵裡並且將其值初始化為一。
第 17行 尋訪統計完成的字典並且輸出其結果。

結果

石, 6
室, 5
詩, 1
士, 1
施, 3
氏, 7
,, 11
嗜, 1
獅, 10
誓, 1
食, 3
十, 9
<這個是換行,但你看不見>
時, 5
適, 6
市, 3
視, 2
是, 7
恃, 1
矢, 1
勢, 1
使, 2
逝, 1
世, 1
拾, 1
屍, 2
濕, 1
侍, 1
拭, 2
始, 2
試, 2
識, 1
實, 1
釋, 1
事, 1

這裡也可以發現 python3也會像 perl一樣會將換行(\n)也會算做是一個字元,python3同樣也可以依照出現的次數進行排序之類的。

對 python3來說不是很難的一件事情。

 

範例二、將DNA序列轉換成對應的胺基酸

這個範列在生物上可能會用到,把DNA的序列轉成對映的胺基酸,DNA的序列主要是由約TACG這四種鹼基三個三個排列組成約20種的胺基酸,我們拿到一串鹼基序列檔,要想辦法改為胺基酸序列。

鹼基序列檔有非常多種的形式,取其中一種較常見的型式作範例。以 python3空字典(dict)來創建、修改鍵(key)或值(value),可以處理未知長度以及內容的字串。

aminos = dict(
TCA = 'S',  TCC = 'S',  TCG = 'S',  TCT = 'S',  TTC = 'F',  TTT = 'F',  TTA = 'L',  TTG = 'L',
TAC = 'Y',  TAT = 'Y',  TAA = '_',  TAG = '_',  TGC = 'C',  TGT = 'C',  TGA = '_',  TGG = 'W',
CTA = 'L',  CTC = 'L',  CTG = 'L',  CTT = 'L',  CCA = 'P',  CCC = 'P',  CCG = 'P',  CCT = 'P',
CAC = 'H',  CAT = 'H',  CAA = 'Q',  CAG = 'Q',  CGA = 'R',  CGC = 'R',  CGG = 'R',  CGT = 'R',
ATA = 'I',  ATC = 'I',  ATT = 'I',  ATG = 'M',  ACA = 'T',  ACC = 'T',  ACG = 'T',  ACT = 'T',
AAC = 'N',  AAT = 'N',  AAA = 'K',  AAG = 'K',  AGC = 'S',  AGT = 'S',  AGA = 'R',  AGG = 'R',
GTA = 'V',  GTC = 'V',  GTG = 'V',  GTT = 'V',  GCA = 'A',  GCC = 'A',  GCG = 'A',  GCT = 'A',
GAC = 'D',  GAT = 'D',  GAA = 'E',  GAG = 'E',  GGA = 'G',  GGC = 'G',  GGG = 'G',  GGT = 'G'
)

DNA="""1 TTGATTACCT TATTTGATCA TTACACATTG TACGCTTGTG TCAAAATATC ACATGTGCCT
       61 TATAAATGTG TACAACTATT AGTTATCCAT AAAAATTAAA AATTAAAAAA TCCGTAAAAT
      121 GGTTTAAGCA TTCAGCAGTG CTGATCTTTC TTAAATTATT TTTCTAATTT TGGAAAGAAA
      181 GCACAAAATC TTTGAATTCA CAATTGCTTA AAGACTGAGG TTAACTTGCC AGTGGCAGGC
      241 TTGAGAGATG AGAGAACTAA CGTCAGAGGA TAGATGGTTT CTTGTACAAA TAACACCCCC
      301 TTATGTATTG TTCTCCACCA CCCCCGCCCA AAAAGCTACT CGACCTATGA AACAAATCAC
      361 ACTATGAGCA CAGATAACCC CAGGCTTCAG GTCTGTAATC TGACTGTGGC CATCGGCAAC
      421 CAGAAATGAG TTTCTTTCTA ATCAGTCTTG CATCAGTCTC CAGTCATTCA TATAAAGGAG
      481 CCCGGGGATG GGAGGATTCG CATTGCTCTT CAGCACCAGG GTTCTGGACA GCGCCCCAAG
      541 CAGGCAGCTG ATCGCACGCC GCTTCCTCTC AATCTCCGCC AGCGCTGCTA CTGCCCCTCT
      601 AGTACCCCCT GCTGCAGAGA AAGAATATTA CACCGGGATC CATGCAGCCA GCAATGATGA
      661 TGTTTTCCAG TAAATACTGG GCACGGAGAG GGTTTTCCCT GGATTCAGCA GTGCCCGAAG
      721 AGCATCAGCT ACTTGGCAGC TCAC"""

dna = []
for x in DNA.split(' '):
    if not x.isdigit() and x != '': dna.append(x);
dna = "".join(dna).replace('\n', '')

for x in range(0, len(dna), 3):
    try: print(aminos[dna[x:x+3]],end="")
    except: raise Exception(f"不正確的序列在位置 {dna[x]}: {x}")
第 1~10行 使用 dict()初始化字典,將「鍵 = 值」依序排列即可。
第 12~24行 儲存在 DNA變數裡的鹼基字串,最左邊的數字是字元位置,FASTA格式[1]
第 26行 創建一個名為 dna的空陣列。
第 27~28行 以 for迴圈去尋訪一個「DNA字串以空格做分割而成的陣列」,如果其內容不是數字或是空格,則添加到 dna陣列裡面。
第 29行 將陣列內容串接成字串,並且將 \n給刪去。
第 31~33行 將 dna字串以三個三個字母做比對並輸出結果,如果其中格式有錯誤(無效的DNA鹼基序),則拋出一個錯誤並立即結束程式。

結果

LITLFDHYTLYACVKISHVPYKCVQLLVIHKN_KLKNP_NGLSIQQC_SFLNYFSNFGKKAQNL_IHNCLKTEVNLPVAGLRDERTNVRG_MVSCTNNTPLCIVLHHPRPKSYSTYETNHTMSTDNPRLQVCNLTVAIGNQK_VSF_SVLHQSPVIHIKEPGDGRIRIALQHQGSGQRPKQAADRTPLPLNLRQRCYCPSSTPCCRERILHRDPCSQQ__CFPVNTGHGEGFPWIQQCPKSISYLAAH

 

以上兩個範例大致上就展示了 python3的強大分析能力,無論字串是什麼格式,只要在 unicode上有編碼,python3都可以處理,甚至連「表情符號」的統計都難不倒 python3喔!

 

參考資料

 

 

 

後記:

小編本身是不會寫 perl的,目前頂多到能看懂的程度而已,這篇也是在練習看懂 perl下的產物。

到現在才知道 perl是一個多麼自由的語言,型態甚至比 python3還要弱,真的是嚇死人,但是在處理字串上面感覺兩種語言都很方便,沒有像 C++那樣遇上字串處理(尤其是中文)般麻煩、棘手。

END

你可能感興趣的文章

【C++】使用SFML製作讓方塊落下的畫面 從開啟新視窗延伸過來的應用(?),配合上一篇所使用到開啟一個可渲染視窗的那堆程式碼的延伸。

【Linux】[CentOS 8]如何更新sudo指令 上次會想要更新sudo這個指令的時間應該是2017年了吧?轉眼間就2021了耶

【Maven】用Maven來託管Wildfly/jBoss的部屬(deploy)、解部屬(undeploy) 極簡版,給未來想要抄作業的小編自己,完整的一切設定檔,可以依照個人需求作增刪。

【Wickct】(縮短網址) 如何將網頁掛載到特定路徑下 Wildfly的預設網址又臭又長又不好記,而且會被看到後端的目錄路徑安排,當然能藏就盡量藏起來啦

【Raspberry Pi/樹梅派】(gcc 10) 如何安裝 gcc & g++ 需要的時間非常久,不愧是gcc的編譯

【教程】(進階版)如何用Sigil製作一本高質量的epub 下載好了Sigil之後除了直接把文字貼進去以外,還有:變更字型、著色、導入CSS……等等功能,不知道你有沒有發現呢?

隨機好文

高捷少女:購票大作戰③  歐巴桑露出懷疑的表情。「怎麼了,您跟夏尼爾小姐不是朋友嗎?只要打電話確認就好了,不是嗎?」「是……是這樣沒錯……可是……」小穹支支吾吾地說。我的確是潔西塔的朋友,但

【歌評】蓮台野夜行 - 幻視之夜 ~ Ghostly Eyes 若有什麼是在聽到boss曲前的鋪襯,那一定就是每個系列的道中曲

【數學】徐氏數學簡明講義(三) 第二章 直線與園 P2.1-15 Q13 13.若阿強解方程式得;   小饅頭解方程式得,則數對(a,b) = ___ 解: 各將她們兩個求得的答案代回去 將第二

小穹‧動畫化‧體驗記之時某人想說的話:關於小穹動畫化體驗記這部作品   之前有大大跟我反應,表示《小穹‧動畫化‧體驗記》的風格跟之前的作品有落差,劇情過於認真,所以我想趁這個機會跟大家聊一

與你的戀愛記憶 ② 看著阿庭傳過來好幾封的訊息,「這便當真不錯吃吶。」我眼神飄向便當 過了一陣子,我才用著輕快的節奏敲打著手機,「不好意思把