2013-01-02 51 views
0

這個問題是取笑我:製作字典中的重疊字典

我有6個不同的序列,每個重疊,他們是名稱1-6。 我已經做了一個函數,它代表了字典中的序列,以及一個函數,它給了我重疊序列的部分。

現在我應該使用這兩個函數來構造一個字典,它將從右到左的順序和從左到右的oder中的重疊位置的數量。

我做了看起來像詞典:

{'1': {'3': 0, '2': 1, '5': 1, '4': 0, '6': 29}, 
'3': {'1': 0, '2': 0, '5': 0, '4': 1, '6': 1}, 
'2': {'1': 13, '3': 1, '5': 21, '4': 0, '6': 0}, 
'5': {'1': 39, '3': 0, '2': 1, '4': 0, '6': 14}, 
'4': {'1': 1, '3': 1, '2': 17, '5': 2, '6': 0}, 
'6': {'1': 0, '3': 43, '2': 0, '5': 0, '4': 1}} 

我似乎是不可能的:

{'1': 'GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC', 
'2': 'CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG', 
'3': 'GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT', 
'4': 'TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG', 
'5': 'CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC', 
'6': 'TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGT'} 

我應該像一個結果而告終。 我猜這不是,所以如果有人可以(不這樣做),但把我推向正確的方向,這將是偉大的。

+1

到目前爲止你有嘗試過什麼嗎? –

+1

請向我們展示您所寫的功能。 –

+1

我不認爲這會影響你的問題的答案,但以防萬一,你是什麼意思的「重疊序列的部分」?你怎麼能把它表示爲一個整數? –

回答

2

這是一個複雜的單線,但它應該工作。使用find_overlaps()作爲查找重疊的功能和seq_dict作爲序列的原始詞典:

overlaps = {seq:{other_seq:find_overlaps(seq_dict[seq],seq_dict[other_seq]) 
    for other_seq in seq_dict if other_seq != seq} for seq in seq_dict} 

這與位更好間距:

overlaps = \ 
{seq: 
    {other_seq: 
     find_overlaps(seq_dict[seq],seq_dict[other_seq]) 
    for other_seq in seq_dict if other_seq != seq} 
for seq in seq_dict} 
+0

我不能真正地測試這個,如果沒有'find_overlaps()'函數並且知道它應該做什麼,但它看起來像預期的那樣使用虛擬「返回1」函數。 –

+0

+1爲理解。非常簡潔。 – jpm

+0

謝謝。不過,我認爲字典解析可能是Python 2.7的一個特性,所以也許應該謹慎使用。 –

1

的清潔方式:

dna = { 
    '1': 'GGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTCGTCCAGACCCCTAGC', 
    '2': 'CTTTACCCGGAAGAGCGGGACGCTGCCCTGCGCGATTCCAGGCTCCCCACGGG', 
    '3': 'GTCTTCAGTAGAAAATTGTTTTTTTCTTCCAAGAGGTCGGAGTCGTGAACACATCAGT', 
    '4': 'TGCGAGGGAAGTGAAGTATTTGACCCTTTACCCGGAAGAGCG', 
    '5': 'CGATTCCAGGCTCCCCACGGGGTACCCATAACTTGACAGTAGATCTC', 
    '6': 'TGACAGTAGATCTCGTCCAGACCCCTAGCTGGTACGTCTTCAGTAGAAAATTG' \ 
     'TTTTTTTCTTCCAAGAGGTCGGAGT' 
} 

def overlap(a, b): 
    l = min(len(a), len(b)) 
    while True: 
     if a[-l:] == b[:l] or l == 0: 
      return l 
     l -= 1 

def all_overlaps(d): 
    result = {} 
    for k1, v1 in d.items(): 
     overlaps = {} 
     for k2, v2 in d.items(): 
      if k1 == k2: 
       continue 
      overlaps[k2] = overlap(v1, v2) 
     result[k1] = overlaps 
    return result 

print all_overlaps(dna) 

(順便提一下,你可以在問題中自己提供overlap,以方便大家回答。)

+0

這大概是我解決它的方法。我喜歡這種方法的可讀性。重疊函數只發現儘可能最短的匹配,當我打賭最長的可能是感興趣的信息。但是,由於這不是真正的問題,我仍然會給你+1。 – jpm

+0

它確實找到了最大可能的匹配:'l'首先被設置爲最大可能的結果('min(len(a),len(b))'),循環從那裏開始向下計數,返回'l'爲就在我們找到一場比賽後。 – Lynn

+0

我站好了。 – jpm