构造DeBruijn图的算法给出了错误的结果

2024-09-29 23:23:54 发布

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

我试图编写一些代码,从Python中的一组kmers(k字母长字符串,DNA测序读取)构造一个DeBruijn图,输出为一组边,将同一个节点连接到其他节点。在

当我在示例输入上运行代码时:

['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']

我得到:

^{pr2}$

而不是:

AGG -> GGG
CAG -> AGG,AGG
GAG -> AGG
GGA -> GAG
GGG -> GGA,GGG

有没有迹象表明我做错了什么?
代码如下:

import itertools

inp=['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']

y=[a[1:] for a in inp]
z=[b[:len(b)-1] for b in inp]

y.extend(z)
edjes=list(set(y))

w=[c[1:] for c in edjes]
v=[d[:len(d)-1] for d in edjes]

w.extend(v)

nodes=list(set(w))

graph={}


new=itertools.product(edjes,edjes)

for node in nodes:
    for edj in new:
        edje1,edje2=edj[0],edj[1]
        if edje1[1:]==node and edje2[:len(edje2)-1]==node:
            if edje1 in graph:
                graph[edje1].append(edje2)
            else:
                graph[edje1]=[edje2]

for val in graph.values():
    val.sort()


for k,v in sorted(graph.items()):
    if len(v)<1:
        continue
   else:
        line=k+' -> '+','.join(v)+'\n'
   print (line)

Tags: 代码innodeforlenifagggraph
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:54

我觉得你让算法太复杂了:你可以先对输入执行唯一性筛选:

inp=['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']

edges=list(set(inp))

然后迭代这个“边”列表。对于每个边,前三个字符是节点,最后三个字符是节点:

^{pr2}$

现在只需将此添加到图表中:

for edge in edges:
    frm = edge[:len(edge)-1]
    to = edge[1:]
    if frm in graph:
        graph[frm].append(to)
    else:
        graph[frm]=[to]

最后像你自己一样进行排序和打印:

for val in graph.values():
    val.sort()

for k,v in sorted(graph.items()):
    print(k+' -> '+','.join(v))

这将导致:

AGG -> GGG
CAG -> AGG
GAG -> AGG
GGA -> GAG
GGG -> GGA,GGG

如您所见,在2行上有一个小的差别:在那里,您期望的输出包含AGG两次,这没有多大意义。在

所以完整的算法是这样的:

inp=['GAGG','CAGG','GGGG','GGGA','CAGG','AGGG','GGAG']

edges=list(set(inp))

graph={}

for edge in edges:
    frm = edge[:len(edge)-1]
    to = edge[1:]
    if frm in graph:
        graph[frm].append(to)
    else:
        graph[frm]=[to]

for val in graph.values():
    val.sort()

for k,v in sorted(graph.items()):
    print(k+' -> '+','.join(v))

你的算法

我认为一个问题是,你认为三个字母序列是“edjes”(可能是edges)。边缘是四个序列字符。通过执行此转换,信息将丢失。接下来,您将构造一组由两个字符组成的项(nodes),它们根本不是节点。它们似乎被用来将节点“粘合”在一起。但在那个阶段,你不知道这些碎片是怎么粘在一起的。在

相关问题 更多 >

    热门问题