我有2个大列表,例如以下2个示例(大和小):
big = [['chr1', 'ENSEMBL', 'exon', '12595', '12721', '.', '+', '.', 'gene_id', '"ENSG00000223972.4";', 'transcript_id', '"ENST00000518655.2";', 'gene_type', '"pseudogene";', 'gene_status', '"KNOWN";', 'gene_name', '"DDX11L1";'], ['chr1', 'ENSEMBL', 'exon', '13403', '13655', '.', '+', '.', 'gene_id', '"ENSG00000223972.4";', 'transcript_id', '"ENST00000518655.2";', 'gene_type', '"pseudogene";', 'gene_status', '"KNOWN";', 'gene_name', '"ACAD9";']]
small = [['ACAD9', 'ENSG00000177646', '372', '503', '0.0010154314', '0.0081838994', '0.4251428571', 'YES\n'], ['ACIN1', 'ENSG00000100813', '167', '647', '8.59E-33', '1.80E-31', '0.2051597052', 'YES\n']]
我想列出big
和small
的列表。实际上,如果inner list
的{{1}}中的第一项等于small
的{{1}}中的18th item
,我想制作一个新的{{ 1}},其中inner list
将具有big
的{{1}}的{{1}}个项目和list of lists
的{{1}}的{{1}}个项目
这是预期的输出:
预期输出:
inner list
为此目的,我编写了以下代码,但未返回预期的输出。你知道如何解决吗?
1st and 2nd
答案 0 :(得分:0)
鉴于两个字符串不同,因此您需要使用in
,但是small
中的一个是big
中的一个的子字符串。为了选择每个列表中的项目,建议您使用itemgetter:
from operator import itemgetter
select_from_small = itemgetter(0, 1)
select_from_big = itemgetter(0, 1, 2, 3, 4, 17)
big = [['chr1', 'ENSEMBL', 'exon', '12595', '12721', '.', '+', '.', 'gene_id', '"ENSG00000223972.4";', 'transcript_id',
'"ENST00000518655.2";', 'gene_type', '"pseudogene";', 'gene_status', '"KNOWN";', 'gene_name', '"DDX11L1";'],
['chr1', 'ENSEMBL', 'exon', '13403', '13655', '.', '+', '.', 'gene_id', '"ENSG00000223972.4";', 'transcript_id',
'"ENST00000518655.2";', 'gene_type', '"pseudogene";', 'gene_status', '"KNOWN";', 'gene_name', '"ACAD9";']]
small = [['ACAD9', 'ENSG00000177646', '372', '503', '0.0010154314', '0.0081838994', '0.4251428571', 'YES\n'],
['ACIN1', 'ENSG00000100813', '167', '647', '8.59E-33', '1.80E-31', '0.2051597052', 'YES\n']]
out = []
for s in small:
for b in big:
if s[0] in b[17]:
out.append(list(select_from_small(s)) + list(select_from_big(b)))
print(out)
输出
[['ACAD9', 'ENSG00000177646', 'chr1', 'ENSEMBL', 'exon', '13403', '13655', '"ACAD9";']]
编写上述代码的另一种 pythonic 方法将是使用以下list comprehension:
out = [list(select_from_small(s) + select_from_big(b)) for s in small for b in big if s[0] in b[17]]
答案 1 :(得分:0)
使用对list
和big
进行迭代的small
理解
In [12]: [s[:2] + b[:5] + [b[-1]] for s in small for b in big if s[0] in b[-1]]
Out[12]:
[['ACAD9',
'ENSG00000177646',
'chr1',
'ENSEMBL',
'exon',
'13403',
'13655',
'"ACAD9";']]