2015-04-19 167 views
1

在我進入我的問題,我想向您提供人與我有什麼迄今。匹配的元素嵌套的字典蟒蛇

首先,我產生一個嵌套的字典從我想用比較的文件。什麼我的字典看上去象下面這樣被描繪(與正在大小的唯一區別)的一個例子:

Negdic = {'ADA': {'NM_000022': ['43248162', '43248939', 
           '43249658', '43251228', 
           '43251469', '43251647', 
           '43252842', '43254209', 
           '43255096', '43257687', 
           '43264867', '43280215', '']}, 
      'ALDOB': {'NM_000035': ['104182841', '104187124', 
            '104187734', '104188836', 
            '104189763', '104190750', 
            '104192036', '104193057', 
            '104197990', '']}} 

現在,這是我,由於我是不熟悉Python和新編程掙扎。我想使用第二個文件來搜索我的字典中的匹配項。我的文件看起來像這樣:

chrom exon_start exon_end strand isoform exon_numer gene coding_length total_mutations_reported total_exonic_mutations exonic_splicing_mutations total_splice_site_mutations 3_ss_mutations 5_ss_mutations 
chr20 43255096 43255240 - NM_000022 4 ADA 144 12 9 0 3 3 0 
chr9 104187734 104187909 - NM_000035 7 ALDOB 175 7 4 0 3 2 1 

我想要做的就是通過我的字典基因名稱搜索,再搭配亞型的名稱,然後最後通過對exon_start相應的亞型列表查找和打印位置在exon_start被找到的列表中。

這裏是我一直在努力與合作一些示例代碼,但我不知道如果我在正確的軌道上。

for line in open("NegativeHotspot.txt"): 
    columns = line.split('\t') 
    if len(columns) >= 2: 
     Hotspotgenes = columns[6] 
     Hotspotgenes2 = Hotspotgenes.split() 
     print Hotspotgenes2 


#print Hotspotgenes2 
#x = type(Hotspotgenes) 
#print x 
#for k in Hotspotgenes: 
# if k in Negdic: 
#  print k, Negdic[k] 

,第一部分是我一直在試圖惹創建文件中的基因列表搜索字典我的結果,但我掙扎,甚至創建從我的名單輸出欄[6]。另外,我甚至不確定我是否以最好的方式處理我的代碼。該編碼部分的最後一部分是我只是在試圖在我的字典中找到匹配而搞亂的東西。

幫助將不勝感激。我迷茫:(

+0

對於初學者,嘗試使用pd.read_csv(filename)讀取文件。您首先需要將pandas導入爲pd。 – Alexander

+1

@Alexander推薦一個第三方庫有什麼可能的幫助,然後不解釋爲什麼,如何或者如何處理它,而不是他已經*完成了? –

+0

要查找字典值,請嘗試gene = Negdic.get(Hotspotgenes2)。然後你需要鏈(這就是爲什麼我建議使用熊貓)。假設strand = columns [4]。然後嘗試gene.get(鏈)。 – Alexander

回答

1

您有一個製表符分隔的值文件,因此您應該使用專用於分隔文件格式的模塊csv

import csv 

您還有標題有意義的名稱。這將會是比較容易的方式來了解這樣做row[header_name]row[col_number],讓我們用csv.DictReader

with open("NegativeHotspot.txt") as f: 
    reader = csv.DictReader(f, delimiter="\t") 

現在我們可以通過reader每一行迭代,並拉出信息則需要使用list.index方法

for row in reader: 
     gene, isoform = row['gene'], row['isoform'] 
     count = Negdic[gene][isoform].index(row['exon_start']) 

你永遠不會說你的最終結果是count變量,但count現在是你的Negdic[gene][isoform]字典中出現exon_start的索引。

+0

非常感謝。這對我非常有幫助! – cosmictypist

1

我會盡量把你在正確的軌道,並指出了幾件事情,可能是有用的,你的未來。當打開您更好地使用「與」文件當你做論據,因爲這將關閉該文件對你那麼做這樣的事情:

with open('eggs.csv', 'rb') as csvfile: 
...  spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
...  for row in spamreader: 
...   print ', '.join(row) 

然後,你需要牢記是什麼人做的是創造一個Python發電機沒有進入細節。當使用一個生成器時,你只能迭代一次對象,所以它不像遍歷一個列表或一個字典,所以如果你想搜索別的東西,你可能需要再次運行你的所有文件。這可以將數據保存到更有用的對象中t就像列表的列表,其中每一行將是一個列表,然後你所有的文件將是這些列表的列表。

然後,你可以創建一個標題和解析您的列表成爲一個字典,你可以索引。所以,如果我有這種類型的CSV:

fruits, vegetables, cars 
banana, cucumber, audi 

的選擇是有字典的列表,每一行看起來像: {「水果」:「香蕉」,「蔬菜」:「黃瓜',...}。所以這對索引更好,但可能不像列表清單那樣緊湊。最後,我會建議您牢記每個對象在Big O時代的表現如何,因爲如果您的數據集很大,它會有所作爲。

使用詞典的問題是,他們是偉大的通過他們的密鑰進行搜索,但如果你想搜索在我向您展示的例子香蕉,它不會是有效的。你將不得不遍歷整個數據尋找與香蕉字典作爲一個價值。