2014-10-07 97 views
-1

我有一個由4個字母組成的文件。我需要計算每個字母的出現次數,然後按出現次數對字母進行排序,然後將該句子寫入相應的文件。如何排序字典並獲取python中的鍵字符串?

例如,如果信T具有最高發生數量,然後ACG按訂單,我想這句話寫入到一個名爲TACG文件。

我知道如何讀取和寫入文件,我已經設法建立一個包含每個字母和它的出現的字典,唯一剩下要做的就是對字典進行排序並獲取名稱該文件脫離它。

在Python中這樣做的最好方法是什麼?

+0

請張貼您的代碼,所以我們可以解決你現有的問題。 – wwii 2014-10-07 16:36:01

+4

你是什麼意思*「排序詞典」*?字典*無序*。你應該看看['collections.Counter'](https://docs.python.org/2/library/collections.html#collections.Counter),這是一個將爲你完成大部分工作的字典子類。 – jonrsharpe 2014-10-07 16:37:57

回答

0

Counter答案是好的,但您最初要求的字典 - 所以這裏就是我認爲 -

在我看來,實現這一目標最簡單的方法是相當「Python的」,並會是這樣的:

# assuming `d` is your dictionary 
order_as_string = ''.join([y[0] for y in sorted(d.iteritems(), key=lambda x: x[1], reverse=True)]) 

這將執行以下操作:

(1)sorted(d.iteritems(), key=lambda x: x[1], reverse=True) - 從由每個項目中的值排序的字典d返回的元組,每個形式的(鍵,值)的列表。 reverse=True確保它按降序排列。 (2)[y[0] for y in sorted...] - 對於(1)中的每個元組,抓住「key」部分(該元組的0項)。從中生成一個列表。

(3)''.join(...) - 用空字符串加入列表(2)中的所有項目,生成一個新字符串。

希望有幫助!

+1

你可以通過利用'sorted'已經返回一個'list'並避免list-comp和'lambda':'''.join(sorted(d,key = d.get,reverse = True)) - 這樣你就可以使用''d''自己的查找,而不是建立另一個'list'並且不保存這些項目作爲排序的一部分(本身) – 2014-10-07 17:54:52

+1

'Counter' *是一個字典子類'dict',引擎蓋下) - 嘗試'isinstance(Counter(),dict)'。 – jonrsharpe 2014-10-07 19:50:43

0

比方說,你已經有你的文字,字符串變量's'

s = 'TACGAGAGCTAGGCAAGCTTGATGCTAGGAA' 
letters = set(s) 

我會統計每個字母有多少次出現在字符串中的,然後做一個元組列表,格式(letter, count)

l = [(letter, s.count(letter)) for letter in letters] 

>>> l 
[('C', 5), ('A', 10), ('T', 6), ('G', 10)] 

然後,只需根據計數對您的列表進行排序。

>>> sorted(l, key = lambda i: i[1], reverse = True) 
[('A', 10), ('G', 10), ('T', 6), ('C', 5)] 

現在,我們有我們的排序名單,只是遍歷,要抓住字母和join他們。

filename = ''.join(i[0] for i in sorted(l, key = lambda i: i[1], reverse = True)) 

>>> filename 
'AGTC' 
1

您可以在一個(短)符合str.joincollections.Counter做到這一點:

>>> from collections import Counter 
>>> "".join([t[0] for t in Counter('TTTTAAACCG').most_common()]) 
'TACG' 

需要注意的是,每對most_common的文檔:

相等計數

元素進行排序任意地

+1

我有:'''.join(k代表k,v代表Counter(s).most_common())':p – 2014-10-07 16:42:35