2014-06-12 27 views
0

我在第1列和第2列中有一個AA序列的文件,它們出現的次數是我使用Counter()創建的, 。在第三欄中我有數值,這些數值都是不同的。列1和列2中的項目可以相同。Python:刪除col 1,2中的重複項並在一行上打印col 3值

Ex。輸入文件:

ADVAEDY   28  0.17805 
ADVAEDY   28  0.17365 
ADVAEDY   28  0.16951 
... 
ARYLGYNSNWYPFDY   23  4.16148 
ARYLGYNSNWYPFDY   23  3.17716 
ARYLGYNSNWYPFDY   23  1.74919 
... 
ARHLGYNSAWYPFDY   21  10.6038 
ARHLGYNSAWYPFDY   21  2.3498 
ARHLGYNSAWYPFDY   21  1.68818 
... 
AGIAFDY   20  0.457553 
AGIAFDY   20  0.416321 
AGIAFDY   20  0.286349 
... 
ATIEDH 4  2.45283 
ATIEDH 4  0.553351 
ATIEDH 4  0.441266 

所以在這個文件中有197行。有從COL 1.產生這個文件中的代碼只有48獨特AA序列:

input_fh = sys.argv[1] # File containing all CDR(x) 
cdr_spec = sys.argv[2] # File containing CDR(x) in one column and specificities in the second 

with open(input_fh, "r") as f1: 
     cdr = [line.strip() for line in f1] 

with open(cdr_spec, "r") as f2: 
     cdr_spec_list = [line.strip().split() for line in f2] 

cdr_spec_out = open("CDR" + c + "_counts_spec.txt", "w") 

counter_cdr = Counter(cdr) 
countermc_cdr = counter_cdr.most_common() 

print len(countermc_cdr) 
#This one might work: 
for k,v in countermc_cdr: 
     for x,y in cdr_spec_list: 
       if k == x: 
         print >> cdr_spec_out, k, '\t', v, '\t', y 

cdr_spec_out.close() 

我要生成是,使用以上的例子通過在欄1和2刪除重複但保留所有mtaching值的輸出在一個山坳行3:

ADVAEDY   28  0.17805, 0.17365, 0.16951 
    ... 
    ARYLGYNSNWYPFDY   23  4.16148, 3.17716, 1.74919 
    ... 
    ARHLGYNSAWYPFDY   21  10.6038, 2.3498, 1.68818 
    ... 
    AGIAFDY   20  0.457553, 0.416321, 0.286349 
    ... 
    ATIEDH 4  2.45283, 0.553351, 0.441266 

此外,對於每個逗號的「新」的第3欄分隔值我需要他們在大的順序最小。我寧願遠離模塊,因爲我仍然在學習python和「pythonic」做事的方式。

任何幫助表示讚賞。

回答

0

是什麼原因導致同樣的AA要打印的額外時間是循環第二:

for x,y in cdr_spec_list: 

嘗試從開始加載cdr_spec_list作爲字典:

with open(cdr_spec, "r") as f2: 
    cdr_spec_dic = defaultdict(list) #a dictionary with the default value of list 
    for ln in f2: 
     k,v = ln.strip().split() 
     cdr_spec_dic[k].append(v) 

現在你有一個字典從每個AA序列到您正在呈現的數值。 所以現在,我們不需要第二個循環,而且我們也可以在我們在那裏排序。

for k,v in countermc_cdr: 
     print >> cdr_spec_out, k, '\t', v, '\t', ' '.join(sorted(cdr_spec_dic[k])) 
+0

你行cdr_spec_dic = defaultdict(名單)上 –

+0

@ user3358205我不明白您的評論... – Korem

+0

您的線路上cdr_spec_dic = defaultdict(名單)我得到一個錯誤。 NameError:名稱'defaultdict'未定義。我試圖先用defaultdict = {}創建一個empy字典,但後來得到這個錯誤:TypeError:'dict'對象不可調用。 –

相關問題