识别整数列表中的保守序列

时间:2015-06-16 14:30:24

标签: python bioinformatics

我有整数列表:

   [[1,2,3,4,5,6,7,8,9],
    [1,2,-7,-6,-5,-4,-3,10,11,12],
    [3,4,-5,6,7,8,11,12,2,2],
    [etc]]
  • 每个列表中可以找到0,1或多次数字
  • 标志可以是否定

我需要找到所有列表中保存的主题。在这里,结果只有一个主题(我手动找到):

 [[3,4,5,6,7],
 [-7,-6,-5,-4,-3],
 [3,4,-5,6,7]]

“motif”是指在所有列表中找到的一系列数字(至少2位数):这里举例说明,在这个连续的顺序中找到数字3,4,5,6,7在所有列表中,尽管在第二个列表中顺序相反。 理想情况下,图案的检测将允许少量差异

有什么想法吗?

我认为使用networkX可以帮助我识别“派系”,但我找不到能帮助我解决这个问题的功能。

2 个答案:

答案 0 :(得分:0)

您可以首先根据子列表的绝对值找到所有子列表之间的一个相交,然后遍历所有子列表并找到所需的交集:

def find_intersection(m_list):
        temp=[map(abs,i) for i in m_list]
        v=set(temp[0])
        for k in temp[1:]:
            v=v.intersection(k)

        for i,k in enumerate(m_list):
            m_list[i]={t for t in k if abs(t) in v}

        return m_list


l=[[1, 2, -3, 4, -5, 6, 7, 8, 9], [1, 2, -7, -6, -5, -4, -3, 10, 11, 12], [3, 4, -5, 6, 7, 8, 11, 12, 2, 2]]

print find_intersection(l)

结果:

[set([2, 4, 6, 7, -5, -3]), set([2, -7, -6, -5, -4, -3]), set([2, 3, 4, 6, 7, -5])]

答案 1 :(得分:0)

a是你的清单

In [78]: b=[[abs(i) for i in elem] for elem in a]

In [81]: c=list(set.intersection(*map(set, b)))


In [84]: [list({i for i in elem if abs(i) in c}) for elem in a]
Out[84]: [[2, 3, 4, 5, 6, 7], [2, -7, -6, -5, -4, -3], [3, 4, -5, 6, 7,  2]]