[精讚] [會員登入]
1077

【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

你可能感興趣的文章

【Discord bot】[botton]按鈕的使用、響應和關閉 Discord的botton通常都要和View配合使用。

【無料版模】﹝CSS&HTML﹞製作epub電子書版模免費下載&附使用教學 一個專門用來製作epub的簡單CSS檔案,基本上已經可以做出一本還不錯的電子書,讓妳的電子書不在只有預設的字體、樣式

【Discord bot 2.0.1】(discord.ui.View)如何將舊機器人升級至目前最新版本 很多時候升級軟體是為了讓別人覺得你的程式很先進,但這次卻是因為要使用某個新功能

【ThinkSpeak】一個IoT數據分析(IoT analytics)及呈現的網站 世界上有著各式各樣的需求,因而誕生出了各式各樣的網站,絕對不是沒有人提供,而是你不知道哪裡有這東西

【Vim】解決貼上文字時出現過多空格的問題 換了新系統,有時候就算重裝軟體並且複製了設定檔也還是會出現非常奇怪的現象

【Maven】如何創建一個簡單可執行的JAR檔 滿重要的一個小功能,畢竟有時候是要傳遞的是JAR檔,而不是直接透過Maven直接部屬之類的

隨機好文

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

高捷少女:美麗島的守護者② 這是在亦晨離開前的下午拍的,當時亦晨在美麗島跟小穹艾米等人在美麗島散步,為離開前補充一些回憶,這時剛好經過的小雅被艾米抓過來,做為同樣是高捷新人的她倆一同拍了一張紀念照。說起來她跟亦晨並不太熟,不過也

高捷少女:耐耐的新年驚喜② 「各位,我跟爸媽聊完了……」耐耐走進客廳,看到大家在看自己的相簿,臉蛋立刻紅了。「哇啊啊,不要看那個!」她三步併作兩步地走向少女們,將相簿拿走。「為什麼啊?小時候的耐耐很可愛啊。」婕兒不解地說。

【歌評】蓮台野夜行 - 幻想的永遠祭 蓮台野的探險雖然結束了,但是,誰知道是不是一段新的探險的序曲呢?

【歌評】蓮台野夜行 -月之妖鳥、化貓之幻 月の妖鳥、化猫の幻 這是一個很好的問題,現實與幻覺的界線從來沒有如此的模糊,沒有一條明確的界線將其畫開