我有一个包含这样的整数的列表(不按顺序排列):
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中执行此操作?
非常感谢您!
答案 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)