根据python中的另一个字符串从列表中提取字符串

时间:2018-11-01 18:46:03

标签: python list

我有一个包含这样的整数的列表(不按顺序排列):

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 :(得分:1)

您可以从第二个列表中为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']

答案 1 :(得分:0)

您可以像这样使用列表理解:

Full_Name                     Name1       Name2       Remaining_name
John Mathew Davidson          John        Davidson       Mathew
Paul Theodre Luther           Paul        Theodre        Luther
Victor George Mary            George      Mary           Victor

答案 2 :(得分:0)

您将不得不遍历两个输入列表,并查看每种组合是否匹配。一种方法是

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

我尝试了Ajax1234使用re的方法,blhsing的代码与我的代码非常相似,除了它使用生成器而不是列表(并且具有更多不透明的变量名),jeremycg的方法{{1 }},以及bilbo_strikes_back的zip方法。 zip方法是迄今为止最快的方法,但是它只占用startswith的前三个元素,而无需考虑list2的内容,因此我们不妨做list1,甚至快点。 Ajax1234的方法所花的时间大约是blhsing的方法的两倍,而blhsing的方法要比我的花费更长的时间。 jeremycg花费的时间略多于一半,但是请记住,它假定子字符串将在开头。

答案 3 :(得分:0)

您可以使用startswith-它需要多个起始字符串的元组来有效扫描:

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

['Contig_1_Length_1000', 'Contig_2_Length_500', 'Contig_3_Length_400']

答案 4 :(得分:0)

一个非常简单的列表理解,例如:

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

答案 5 :(得分:-1)

尝试压缩和切片

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)