用字典编重叠的字典

2024-10-04 01:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题在戏弄我:

我有6个不同的序列,每个序列重叠,它们被命名为1-6。 我做了一个函数来表示字典中的序列,还有一个函数来表示序列中重叠的部分。你知道吗

现在,我应该使用这两个函数来构造一个字典,它按照从右到左的顺序和从左到右的顺序计算重叠位置的数量。你知道吗

我做的字典看起来像:

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

我似乎不可能。 我想不是这样的,所以如果有人能(不这么做)把我推向正确的方向,那就太好了。你知道吗


Tags: 函数数量字典顺序序列方向命名ggctccccacggggtacccataacttgacagtagatctcgtccagacccctagc
2条回答

清洁方式:

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你自己,让大家更容易回答。)

这是一个有点复杂的一行,但它应该工作。使用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}

相关问题 更多 >