2015-08-08 79 views
0

通過使用迭代和解析,我創建了一個存儲與值(與特定功能相關的統計信息)的關鍵字的Python字典。鍵,指的是一個唯一的ID(在我的情況下,一個基因)。我已通過的每一個指示一個特徵的起始點長度元組的列表(在這種情況下,ORF或者換句話說潛在蛋白編碼序列)基因ID的填充值。任何給定的基因可以有許多這樣的特徵。一般形式是如下:通過元組字典進行解析

{key1:[(startpoint1,length1)], key2[(startpoint1,length1)(startpoint2,length2)...], key3[]} 

如下圖所示(在樣品字典),有些鍵只能有一個特徵(只有一個元組對),而其他人可能有多達100或更多。爲了簡單起見,我已經展示了3對seq1。也有可能是沒有的功能和按鍵,例如,SEQ3 4.

{'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []}

我想通過這本詞典迭代獲得「啓動點」的時候,「長」是最大的。在我的例子,答案我應該得到的是

起始點1(在SEQ1),因爲它有最大的長度值(12)所有參賽作品中

我覺得很難迭代多個元組。

+0

你覺得在迭代多個元組很難嗎?你是否面臨任何嘗試的問題?如果是這樣,請張貼,以及您面臨的問題 –

+0

相關:http://stackoverflow.com/questions/5098580/implementing-argmax-in-python也注意到[最大可以採取一個可迭代和自定義函數] (https://docs.python.org/2/library/functions.html#max) – Paul

回答

1

您還可以使用itertools.chain.from_iterable,通過它(在你的字典中的所有值的列表)的dict.values()。然後使用max與密鑰參數,在第二索引(1-指數)取回與最大值的元組,實施例 -

>>> from itertools import chain 
>>> d = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 
>>> max(chain.from_iterable(d.values()),key=lambda x: x[1]) 
(1, 12) 

itertools.chain.from_iterable,需要它得到作爲輸入,並且每個上行鏈成可迭代單列表,實例 -

>>> l = [(1,2),(3,4)] 
>>> list(chain.from_iterable(l)) 
[1, 2, 3, 4] 
+0

謝謝。我嘗試了嵌套循環,並在語法中迷失方向。 –

+0

很高興我能幫到你。我想通過點擊該答案左側的勾號來建議您接受答案(最能幫助您,最喜歡的答案),這對社區會有所幫助。 –

+0

您可能希望使用'itervalues'而不是'values'來減少內存足跡:'values'創建一個拷貝字典的值,而'itervalues'不會。 –

1

這段代碼應該做的。

myDict = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 

maxLength = 0; 
maxStartingPoint = 0; 
maxSeq = "" 

for sequence in myDict: 

    for key,value in myDict[sequence]: 
     if value > maxLength: 
      maxLength = value 
      maxStartingPoint = key 
      maxSeq = sequence 
+0

謝謝!好的迭代雖然是一個列表字典。 –

0

這裏是我的方法:創建元組(length, start_point, key),這樣的列表,則max功能可以隨便挑與最大長度的元組。

def maxlen(seq): 
    longest = max((length, start_point, key) for key, value in seq.iteritems() for start_point, length in value) 
    return longest 

# Test 
seq = {'seq2': [(1,6)], 'seq1': [(1, 12), (16, 9), (32,9)], 'seq3': [], 'seq4': []} 
length, start_point, key = maxlen(seq) # 12, 1, 'seq1'