第三章華中農(nóng)業(yè)生物信息中心_第1頁
第三章華中農(nóng)業(yè)生物信息中心_第2頁
第三章華中農(nóng)業(yè)生物信息中心_第3頁
第三章華中農(nóng)業(yè)生物信息中心_第4頁
第三章華中農(nóng)業(yè)生物信息中心_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第三章 哈希 劉 融 華中農(nóng)業(yè)大學生物信息中心哈希又被稱為散列或關聯(lián)數(shù)組,是一種數(shù)據(jù)結構,可以包含任意多個值,并以“鍵”來尋找相應的值;鍵通常都是字符串,且可以是任意字符串,但彼此間不能相同,對應的值則不受此限制。哈希的定義哈希的用途如果兩組數(shù)據(jù)間存在一一對應的關系,且一組數(shù)據(jù)中的標量值不存在重復,這時可以使用哈希。例如:按IP地址查找主機名按身份證號找出姓名按單詞統(tǒng)計其出現(xiàn)次數(shù) 按基因名查找ORF 按蛋白質ID查找氨基酸序列或結構從DNA到Protein哈希賦值類似于數(shù)組,不同的是用于賦值的列表是一些“鍵/值”對。例如:%postcode=(Beijing, 100000, Shanghai

2、, 200001, Nanjing, 210001, Shenyang, 110001);注意:哈希里面的元素是沒有順序的,因此輸出的時候不一定是原來賦值的順序,但是對應的“鍵/值”不會變化。postcode=%postcode;print “postcode”; #不能為“%postcode”胖箭頭= 它相當于“,”,使賦值看上去更直觀。%postcode=( “Beijing”=100000,“Shanghai” =200001,“Nanjing” =210001,“Shenyang” =110001,);注意: (I)使用胖箭頭,可以省略鍵的引號; (II)最后一個逗號,不是必需的,但最

3、好寫上。哈希復制給哈希:%hash0=%hash1數(shù)組給哈希賦值:%hash=a;訪問hash元素 訪問hash元素,可以使用下面的語法:$hash $key %family_name=(fred=flintstone, barney=rubble);print $family_namefred.n;print $family_namebarney.n;foreach $person (qw) print $person : $family_name$person.n; 哈希的鍵值可以為表達式$str = bar; print $family_name$str.ney對已存在元素賦值會覆蓋之前

4、的值$family_namebarney=astaire;哈希元素因賦值而誕生$family_namewilma=rubble;訪問不存在的元素返回undef$granite= $family_namelarry練習:對下表中的基因及相應的表達量構建哈希,從鍵盤輸入其中一個基因名,并打印其相應的表達量。%gene_exp=(recA, 2.30, recB, 2.27 , recC, 2.42 , recD, 2.13 , recF, 1.24); print Enter the gene name:; chop ($find=); print $find has the expression

5、 value $gene_exp$findn; reverse函數(shù)進行操作reverse %hash,會先將hash轉換成“鍵/值”對的列表形式(key1,value1,key2,value2keyn,valuen),然后翻轉列表同時鍵值互換,生成(valuen,keyn,value2,key2,value1,key1),此時原來的值成為鍵,鍵成為值。該操作適用于鍵和值一一對應的情況,否則會造成值丟失。%postcode=(Beijing, 100000, Shanghai, 200001, Nanjing,210001, Shenyang,110001);citycode1= %postco

6、de;citycode2=reverse %postcode;print citycode1n;print citycode2;keys和values函數(shù)keys返回鍵列表,values返回值列表。%postcode=(Beijing, 100000, Shanghai, 200001, Nanjing,210001, Shenyang,110001);keys1=keys %postcode;values1=values %postcode;$keys1=keys %postcode;print keys1n;print values1n;print $keys1;each函數(shù)each用于迭

7、代訪問整個哈希,以包含兩個元素的列表形式返回“鍵/值”對,每調用一次each,返回下一組“鍵/值”對,通常用于while控制結構中。%postcode=(Beijing, 100000, Shanghai, 200001, Nanjing,210001, Shenyang,110001);while($key,$value)=each %postcode) print $key=$valuen;遍歷哈希中的錯誤訪問哈希切片切片(slice)就是把數(shù)組或散列中的部分元素提取到一個新的數(shù)組。exists函數(shù)用來檢查哈希中是否存在某個鍵,與鍵對應的值無關。 if(exists $books$dino

8、) print “Hey, theres a library card for dino!n”;注意:即使某個鍵對應的值為空,它仍然存在。delete函數(shù)用于刪除哈希中某個鍵及其對應的值$person = “betty”;delete $books$person; #將$person 的借書卡刪除掉獲取哈希大小%ages = (Martin = 28, Sharon = 35, Rikke = 29); print Hash size: ,scalar keys %ages,n; print Hash size: ,scalar values %ages,n; delete和exist的示例%

9、last_name = ( Jaime = Fraser, Brendan = Fraser, Lenny = Teytelman, Venky = Iyer,);print scalar keys %last_name ,n; delete $last_nameJaime;print scalar values %last_name ,n; if (exists $last_nameJaime) print Jaime has a last name!;else print Your name dose not exist!;哈希排序按鍵排序%hash = ( 123 = 54, 323 =

10、 165, 22 = 73, );foreach $key ( sort keys %hash ) print $key: $hash$keyn;print n;foreach $key ( sort $a$b keys %hash ) print $key: $hash$keyn;按值排序%hash=(Beijing, 107, Shanghai, 98, Nanjing, 100, Shenyang, 927);foreach $key ( sort $hash$a $hash$b keys %hash) print $key: $hash$keyn;print n;foreach $ke

11、y ( sort $hash$b $hash$a keys %hash) print $key: $hash$keyn;print n;foreach $key ( sort $hash$a cmp $hash$b keys %hash) print $key: $hash$keyn;print n;foreach $key ( sort $hash$b cmp $hash$a keys %hash) print $key: $hash$keyn;聯(lián)合鍵值排序%userids = ( williams = Marketing, smith = Research, johnson = Resea

12、rch, jones = Marketing, brown = Marketing, davis = Research);foreach (sort ($userids$a cmp $userids$b) | ($a cmp $b) keys %userids) print $_: $userids$_n;哈希使用示例打印數(shù)組中不重復的元素fishwords = (one,fish,two,fish,red,fish,blue,fish);%seen = ();foreach (fishwords) $seen$_ = 1;uniquewords = keys %seen;val = valu

13、es %seen;print uniquewords;print n;print val;打印兩個數(shù)組中相同或不同的元素grep按某種模式expr去匹配數(shù)組中的每個元素,匹配成功的元素組成一個新的數(shù)組,返回該新數(shù)組。grep EXPR, LISTarray = qw(greyhound bloodhound hello hand);hound = grep /hound/,array;print houndn;#打印出greyhound和bloodhound 練習:利用哈希統(tǒng)計單詞數(shù)假設某個文件包含一列單詞,我們可以將其內容先讀到數(shù) 組中,然后將其作為哈希鍵值進行操作,那么該單詞出現(xiàn) 的次數(shù)就

14、是該鍵對應的值file=qw/beijing shanghai wuhan zhejiang wuhan hubei beijing jilin qingdao liuzhou zhejiang/;foreach $word (file) $count$word+=1; while($key,$value)=each %count)print $key=$valuen;哈希的數(shù)組(Array of Hash)格式AoH = ( husband = barney, wife = betty, son = bamm, husband = george, wife = jane, son = elr

15、oy, husband = homer, wife = marge, son = bart, );添加元素push AoH, husband = fred, wife = wilma, daughter = pebbles ; 生成AOH已有文件中的數(shù)據(jù)格式如下 :husband=fred friend=barney husband=paul friend=laurie 生成AOH的代碼如下:while ( ) $rec = ;foreach $field ( split ) ($key, $value) = split /=/, $field; $rec-$key = $value; pus

16、h AoH, $rec; 訪問和打印AOH訪問單個元素格式: $AoH0husband; 遍歷打印AOHforeach $href ( AoH ) print ; foreach $role ( keys %$href ) print $role=$href-$role ; print n;foreach $i ( 0 . $#AoH ) print $i is ; foreach $role ( keys % $AoH$i ) print $role=$AoH$i$role ; print n;數(shù)組的哈希(Hash of Array)格式%HoA = ( flintstones = fred

17、, barney , jetsons = george, jane, elroy , simpsons = homer, marge, bart , );添加元素$HoAteletubbies = tinky winky, dipsy, laa-laa, po ; 生成HOA已有文件中的數(shù)據(jù)格式如下 :flintstones: fred barney wilma dinojetsons: george jane elroysimpsons: homer marge bart 生成HOA的代碼如下:while ( $line = ) ($who, $rest) = split /:s*/, $line, 2; fields = split , $rest; $HoA$who = fields ; 訪問和打印HOA訪問單個元素:$HoAflintstones0;遍歷打印HOA:哈希的哈希(Hash of Hash)%microarray_set = ( time0 = recA = 2.0, recB = 2.0, recC = 2.0, time2 = recA = 2.0, recB = 4.0, recC = 1.7, time4 = recA = 2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論