在python中操作列表的列表并创建一个新列表

时间:2018-11-07 12:04:08

标签: python list

我有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']]

我想列出bigsmall的列表。实际上,如果inner list的{​​{1}}中的第一项等于small的{​​{1}}中的18th item,我想制作一个新的{{ 1}},其中inner list将具有big的{​​{1}}的{​​{1}}个项目和list of lists的{​​{1}}的{​​{1}}个项目

这是预期的输出:

预期输出:

inner list

为此目的,我编写了以下代码,但未返回预期的输出。你知道如何解决吗?

1st and 2nd

2 个答案:

答案 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)

使用对listbig进行迭代的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";']]