извлекать строки из списка на основе другой строки в Python - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть список, содержащий следующие целые числа (не по порядку):

list1 = [2,1,3]

У меня есть второй список, подобный этому:

list2 = ['Contig_1_Length_1000','Contig_2_Length_500','Contig_3_Length_400','Contig_4_Length_300','Contig_5_Length_200','Contig_6_Length_100']

Эти списки взяты из файлов fasta. список 2 всегда начинается с "Contig_", но не всегда в порядке сортировки. Я хотел бы вернуть такой список:

list3 = ['Contig_1_Length_1000','Contig_2_Length_500','Contig_3_Length_400']

list3 содержит контиги, номер которых появился только в list1.

Как это сделать в python?

Большое спасибо!

Ответы [ 6 ]

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

Довольно простое понимание списка вроде:

list1 = ['Contig_1','Contig_2','Contig_3']
list2 = ['Contig_1_Length_1000','Contig_2_Length_500','Contig_3_Length_400','Contig_4_Length_300','Contig_5_Length_200','Contig_6_Length_100']

list3 = [s for s in list2 for k in list1 if k in s]

print(list3)

дает вывод:

['Contig_1_Length_1000', 'Contig_2_Length_500', 'Contig_3_Length_400']  
0 голосов
/ 01 ноября 2018

Вы можете использовать старты с - для эффективного сканирования требуется кортеж из нескольких начальных строк:

[i for i in list2 if i.startswith(tuple(list1))]

['Contig_1_Length_1000', 'Contig_2_Length_500', 'Contig_3_Length_400']
0 голосов
/ 01 ноября 2018

Вам нужно будет перебрать два списка ввода и посмотреть для каждой комбинации, есть ли совпадение. Один из способов сделать это -

[list2_item for list2_item in list2 if any([list1_item in list2_item for list1_item in list1])]

Я попробовал метод Ajax1234, использующий код re, blhsing, который похож на мой, за исключением того, что он использует генератор, а не список (и имеет более непрозрачные имена переменных), метод jeremycg, равный startswith и метод zil bilbo_strikes_back. Метод zip был безусловно самым быстрым, но он просто берет первые три элемента list2, не заботясь о содержимом list1, поэтому мы могли бы также сделать list3 = list2[:3], что было даже быстрее. Метод Ajax1234 занял примерно вдвое больше времени, чем blhsing, что заняло немного больше, чем мой. jeremycg занял чуть больше половины времени, но имейте в виду, что он предполагает, что подстрока будет в начале.

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

Вы можете использовать понимание списка следующим образом:

list3 = [i for i in list2 if any(j in i for j in list1)]
0 голосов
/ 01 ноября 2018

попробуйте почтовый индекс и нарезка

list1 = ['Contig_1','Contig_2','Contig_3']
list2 = ['Contig_1_Length_1000','Contig_2_Length_500','Contig_3_Length_400','Contig_4_Length_300','Contig_5_Length_200','Contig_6_Length_100']
list3 = [x[1] for x in zip(list1, list2)]
print(list3)
0 голосов
/ 01 ноября 2018

Вы можете создать словарь из второго списка для O(n) (линейного) решения:

import re
list1 = [2,1,3]
list2 = ['Contig_1_Length_1000','Contig_2_Length_500','Contig_3_Length_400','Contig_4_Length_300','Contig_5_Length_200','Contig_6_Length_100']
new_result = {int(re.findall('(?<=^Contig_)\d+', i)[0]):i for i in list2}
final_result = [new_result[i] for i in list1]

Выход:

['Contig_2_Length_500', 'Contig_1_Length_1000', 'Contig_3_Length_400']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...