0

この問題は私をからかっています:

それぞれが重複する6つの異なるシーケンスがあり、それらは名前1〜6です。辞書内のシーケンスを表す関数と、重複するシーケンスの一部を提供する関数を作成しました。

ここで、これらの 2 つの関数を使用して、右から左の順序と左から右の順序の両方で重複する位置の数を取る辞書を作成する必要があります。

私が作った辞書は次のようになります。

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

私は次のような結果になるはずです:

{'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}}

無理そうです。そうではないと思うので、もし誰かが私を正しい方向に押しやることができたら(それをすることはできません)、それは素晴らしいことです.

4

2 に答える 2

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}
于 2013-01-02T22:26:15.143 に答える
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全員が回答しやすいように、質問に自分自身を入力することもできます。)

于 2013-01-02T22:38:07.683 に答える