2013-01-02 52 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