манипулируя списком в Python и создавая новый - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть 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. на самом деле, если 1-й элемент в inner list из small равен 18th item в inner list из big, я хочу создать новый list of lists, в котором inner list будет иметь 1st and 2nd предметов inner list от small и 1st, 2nd, 3rd, 4th, 5th and 18th предметов inner list от big.

вот ожидаемый результат:

ожидаемый результат:

out = [['ACAD9', 'ENSG00000177646', 'chr1', 'ENSEMBL', 'exon', '13403', '13655', '"ACAD9";']]

для этой цели я написал следующий код, но он не возвращает ожидаемый результат. ты знаешь как это исправить?

final = []
for i in range(0, len(eg)):
    for j in range(0, len(gt)):
        gtf_row = gt[j]
        esse_gene_row = eg[i]
        gtf_column = gtf_row.split()
        esse_gene_column = esse_gene_row.split()
        gtf_symbol = gtf_columns[17]
        esse_gene_symbol = esse_gene_columns[0]
        if gtf_symbol == esse_gene_symbol:
            final.append(gt(j))

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Использование 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";']]
0 голосов
/ 07 ноября 2018

Вам необходимо использовать 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 способ написания вышеприведенного кода будет состоять в следующем понимании списка :

out = [list(select_from_small(s) + select_from_big(b)) for s in small for b in big if s[0] in b[17]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...