[精讚] [會員登入]
1165

【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

你可能感興趣的文章

【Arduino/LinkIt 7697】實作小小的 MQTT Publish & Subscribe 若是要多點對多點傳輸資料,那使用 MQTT 即可快速的達成我們所需的目的

【Docker&Wildfly】(bitnami/wildfly)如何從零開始創建網頁伺服器 使用他人的 docker image 來架設我們的 wildfly web server

【CoreProtect】自行升級至 Minecraft 1.21.x、1.22.x 或更高版本 不知道為什麼,官方竟然無預警停止更新,我們只好自行救濟

【C】〔無條件捨去〕如何忽略float數據 直接儲存成int型態(數據100%不失真) a148: You Cannot Pass?! 解題時所意外研究出來的神奇寫法,懂了原理之後要自行改寫成四捨五入或無條件進位應該就簡單了吧!

【JDA/discord bot】取得頻道第一筆或最新(最後一筆)的歷史訊息 在不處理訊息的先後順序下取得相關的歷史訊息

【Minecraft】[CoreProtect|BungeeCord]如何重新命名世界或維度名稱 當只有一個伺服器的時候,問題往往處理起來非常簡單,但是一旦當伺服器成長至兩台以上,事情便開始有趣了起來

隨機好文

【分享、整合串】什麼?!高捷少女竟然有二創小說!! 由時零宇宙大大在巴哈上面連載的二創高捷少女小說,就讓我們來看看,究竟在時零大大的巧手下,高捷少女們會擦出什麼樣的火花吧!

高捷少女:小穹與果仁巧克力㊦ 「如果妳跟一個女生同班三年,看過她午休流口水跟狼吞虎嚥地吃午餐,就算變成高捷代言人,也很難把她當女神的啦!」她說,小穹氣得搶走她義大利麵裡的蝦子,其他人笑得花枝招展。

高捷少女:地下城的探險少女① 婕兒心中一奇,便走上前看著仔細。那塊凹進去的地方中心大約三公分厚,越往邊緣就越淺,圓型直徑十五公分。婕兒拿出銅盤對比一下,發現兩者大小竟然一致,銅盤似乎能夠完整的嵌進去。     婕兒看著凹槽,心中

高捷少女:地下城的探險少女② 「等我一下喔,我好像有帶去漬的清潔噴霧。」婕兒翻翻飛揚,拿出噴霧劑給小穹,小穹趕緊對著汙漬噴了噴,紅茶漬果然乾淨了許多。「婕兒,謝謝妳。來,還妳。」小穹感謝地把噴霧還給她,卻發現婕兒盯著打開的飛揚,一

【日翻中歌詞】LOSER 一如往常的孤身一人 早就已經被折磨殆盡 明明就已經無處可去 卻作著白日夢 晚安 無論何時都是這個樣子 對懵懂夜晚早感到噁心