python - 对列表列表进行排序以查找共享变体

标签 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 中的所有这些行,并挑选出特定内部列表与其第 5 项共享相同字符的行,只要该字符不是 ' .'。一旦我确定了这样的行,我就会将该行的第一项放入单独的列表中。

例如,在上面的第一个列表中,前两个内部列表共享 '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)、(2,3)、(3,4)、 (1,4)、(1,3)、(2,4))。

如何以更有效的方式获得相同的结果,而不需要我放入这段代码,但使用不同的数字,6次?

最佳答案

您可以尝试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']]}

关于python - 对列表列表进行排序以查找共享变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512212/

相关文章:

python - 删除 numpy 数组的一列

使用 matplotlib 的 Python 动画

python - 使用 "Biopython"- 我怎样才能改进我的代码

r - 将 Bam 文件转换为 CSV

python - __init__ 在 GUI 中与 tkinter

python - 从 Python 生成图形的最简单方法?

python - 如何在 Python 中组合两个列表的每个元素?

python - 如何从整数列表中删除所有字符串元素,整数旁边有字符串 [Python]

C# List .ConvertAll 效率和开销

python - 如何使用python计算csv文件中具有条件的元素