Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对列表列表进行排序以查找共享变体_Python_List_Bioinformatics - Fatal编程技术网

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

Python 对列表列表进行排序以查找共享变体,python,list,bioinformatics,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', '

我有一个名为
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   
sharedLists1\u 2=[]
i=0
而我
目前,我正在运行此代码的一个版本6次,以获取列表中四项的所有成对组合((1,2)、(2,3)、(3,4)、(1,4)、(1,3)、(2,4))

我怎样才能得到相同的结果,但效率更高,不需要我输入这段代码,而是不同的数字,6次?

你可以试试。迭代所有2个元素组合并检查您的条件。如果匹配,您可以将结果附加到存储每个索引对结果的字典中

要检查剩余列表的值是否不同(除了给定组合的
i
j
),可以在遍历剩余索引时使用:

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

在<码><码><码>[[“AC合并及控制有关的控制工程的10464个方面,2,,,,“T,,,,,,,,“29.5864,,,,,,,,,,,,,,“DP=1;MQ0;MQ0F=0;安=0;安=0;0;DP4=0;0;0;0,0,0,0,0,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;MQ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“.”,“DP=1;MQ0F=0;AN=0;DP4=0,0,0;MQ=”,“GT”,“./”,['ACmerged_contig_10464','2','T','29.5864','DP=1;MQ0F=0;AN=0;DP4=0,0,0;MQ=','GT','/.]]
,例如,第5项是什么?您对要检查的组合的描述不清楚。在您的代码中,您检查的是来自不同内部列表的项目。@codrelphi所有最内部列表的第五项是
@滑块我已经更新了我的文本,可能这提供了更多的说明。我确实在检查来自不同内部列表的项目,但最后我只想输出其中一个内部列表。您需要进一步说明什么?@wilberox:您给我们的代码不起作用。检查一下!我认为这不完全有效:当我打印
共享列表.keys()
时,它显示只有两种组合:
[(0,1)、(2,3)]我需要六个:'[(0,1)、(2,3)、(0,2)、(1,3)、(0,3)、(1,2)]@wilberox这意味着只有这些组合符合条件。但它确实适用于所有六种组合。您可以在for循环中添加
print
语句来打印
i
j
,以进行验证。如果我想检查三组列表之间的相似性,我会使用itertools导入组合中的
红色列表={}对于allLinesList中的行:索引=集合(范围(len(line)),对于组合中的i,j(范围(len(line)),3):剩余=索引-{i,j}如果行[i][4]!=“,[i][4]==行[j][4]和所有(行[i][4]!=行[x][4]:共享列表。setdefault((i,j),[])。追加(行[j])打印(共享_列表)
?即,将第7行中的
2
更改为
3
?@wilberox对于3元素组合,您可能需要类似于
的内容,用于组合中的i、j、k(范围(len(行)),3)
因为元组的大小为3。类似地,
剩余的
必须是
剩余=索引-{i,j,k}
并且您的
if
条件必须检查
行[k]
也是。更好的方法是使用
all
进行阳性检查。是的,我相信我现在已经做了类似的事情,谢谢你的帮助。