排序列表列表以查找共享的变体

时间:2019-10-22 20:56:26

标签: python list bioinformatics

我有一个名为allLinesList的列表列表,allLinesList的每一行都包含四个列表。这是allLinesList

的两行
[[['ACmerged_contig_10464', '668', '.', 'A', 'G', '3.87133', '.', 'DP=1;SGB=-0.379885;MQ0F=0;AC=0;AN=2;DP4=0,0,0,1;MQ=28', 'GT:PL', '0/0:28,3,0'], ['ACmerged_contig_10464', '668', '.', 'A', 'G', '3.87133', '.', 'DP=1;SGB=-0.379885;MQ0F=0;AC=0;AN=2;DP4=0,0,0,1;MQ=28', 'GT:PL', '0/0:28,3,0'], ['ACmerged_contig_10464', '747', '.', 'T', '.', '84', '.', 'DP=2;MQ0F=0;AN=2;DP4=0,2,0,0;MQ=32', 'GT', '0/0'], ['ACmerged_contig_10464', '747', '.', 'T', '.', '84', '.', 'DP=2;MQ0F=0;AN=2;DP4=0,2,0,0;MQ=32', 'GT', '0/0']],
[['ACmerged_contig_10464', '4', '.', 'T', '.', '29.5864', '.', 'DP=1;MQ0F=0;AN=0;DP4=0,0,0,0;MQ=.', 'GT', './.'], ['ACmerged_contig_10464', '4', '.', 'T', '.', '29.5864', '.', 'DP=1;MQ0F=0;AN=0;DP4=0,0,0,0;MQ=.', 'GT', './.'], ['ACmerged_contig_10464', '4', '.', 'T', '.', '29.5864', '.', 'DP=1;MQ0F=0;AN=0;DP4=0,0,0,0;MQ=.', 'GT', './.'], ['ACmerged_contig_10464', '4', '.', 'T', '.', '29.5864', '.', 'DP=1;MQ0F=0;AN=0;DP4=0,0,0,0;MQ=.', 'GT', './.']]]

allLinesList中总共有两千行。

我想遍历allLinesList中的所有这些行,并挑选出特定内在列表与第五项具有相同字符的行,只要该字符不是'.'。一旦确定了这样的行,我将把该行的第一项放入单独的列表中。

例如,在上面的第一个列表中,前两个内部列表共享'G'作为其第五项。因此,我想将这些列表之一输出到其他列表。这样会创建另一个列表列表,但其中一个列表只有两层列表,而不是像我的示例那样的三层列表。

我有可以执行此操作的代码,但是我认为必须有一种更有效的方法来执行此操作,例如使用循环,而我还没有弄清楚。这是我当前的代码:

sharedLists1_2 = []
i = 0
while i < len(allLinesList):
    if allLinesList[i][0][4] != "." and allLinesList[i][0][4] == allLinesList[i][1][4] and allLinesList[i][1][4] != allLinesList[i][2][4] and allLinesList[i][1][4] != allLinesList[i][3][4]:
        sharedLists1_2.append(allLinesList[i][1])
    i +=1   

此刻,我正在运行此代码的版本6次,以获取列表中((1,2,3,(2,3),(3,4), (1,4),(1,3),(2,4))。

如何获得相同的结果,但以一种更有效的方式,而不涉及我放入此代码块,而使用不同的数字6次?

1 个答案:

答案 0 :(得分:1)

您可以尝试itertools.combinations。遍历所有2个元素组合并检查条件。如果匹配,则可以将结果附加到存储每个索引对结果的字典中

要检查其余列表的值是否不同(对于给定组合,ij除外),可以在遍历其余索引的同时使用all

from itertools import combinations

shared_lists = {}    

for line in allLinesList:
    indices = set(range(len(line)))
    for i, j in combinations(range(len(line)), 2):
        remaining = indices - {i, j}
        if line[i][4] != "." and line[i][4] == line[j][4] and all(line[i][4] != line[x][4] for x in remaining):
            shared_lists.setdefault((i, j), []).append(line[j])

print(shared_lists)

输出

{(0, 1): [['ACmerged_contig_10464', '668', '.', 'A', 'G', '3.87133', '.', 'DP=1;SGB=-0.379885;MQ0F=0;AC=0;AN=2;DP4=0,0,0,1;MQ=28', 'GT:PL', '0/0:28,3,0']]}