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
进行阳性检查。是的,我相信我现在已经做了类似的事情,谢谢你的帮助。