Python 如何通过搜索列表1中的子字符串来查找列表2中的完整字符串?

Python 如何通过搜索列表1中的子字符串来查找列表2中的完整字符串?,python,python-3.x,Python,Python 3.x,我有两个由氨基酸序列组成的列表(这不是一个生物学问题,而是为了上下文而说明),其中List1包含完整字符串(完整序列)的子字符串(部分序列)List2包含完整的字符串,其中一些字符串包含来自List1的子字符串,而一些字符串不包含 这些列表很大,这就是为什么要创建它们,但现在我不知道如何跟踪子字符串到完整字符串 下面是使用我自己数据集中的真实数据修改后的两个列表的示例。对于List1中包含的两个子字符串,在List2中应该有两个匹配项。我已确认匹配项在列表2中 List1 = ['QSLNQNV

我有两个由氨基酸序列组成的列表(这不是一个生物学问题,而是为了上下文而说明),其中
List1
包含完整字符串(完整序列)的子字符串(部分序列)
List2
包含完整的字符串,其中一些字符串包含来自
List1
的子字符串,而一些字符串不包含

这些列表很大,这就是为什么要创建它们,但现在我不知道如何跟踪子字符串到完整字符串

下面是使用我自己数据集中的真实数据修改后的两个列表的示例。对于
List1
中包含的两个子字符串,在
List2
中应该有两个匹配项。我已确认匹配项在
列表2中

List1 = ['QSLNQNVVSRTCPAVVSHRARRAVRVMATGSPLTFSKYQGLGNDFILIDNRHTSEPVVTPEQAVKICDRNFGVGGDGVIFALPPVGETDLTMRIFNSDGSEPEMCGNGIRCLAKFVADIDKSSPRKYKIHTLAGLIQPELLADGQVRVDMGAPILDGSKVPTTLTPTEGNTVVQQDLVVDGKTYKVTCVSMGNPHAVIYTCNGKTIKIDDLESDLAALGPKFERNTVFPARTNTEFVEVISPSHVRMVVWERGAGRTLACGTGACALVVAGILEGRVDRSKTCRVDLPGGPLQIEWSTVDNHIYMTGPAELVFGGSLRV', 'DMRISYERGGLEEAAFRGRDPMQVFDEWFKAAVAGKVCEEPNAISLASSNPSGQPSVRVVLLKGYDERGFVFYTNYSSRKGTELESGSAAFSIYWEKLQRQIRVEGTVEHVSEEESTAYFHSRPRGSQIGAWVSAQSQPCRNRGEMEARNAELQQRFSDESVPVPKPPHWGGYLIRPTRIEFWQGRPSRLHDRIRFRRPSPNESWVMERLQP']
List2 = [Seq('SSLPSNSVWASGKSYLGHLY*CVHPAHTVTFTLPLVAA*YRALSYDVRRSKFLT...LHL', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('PLYHLILSGPLENPT*DTYTDAFILLTRSLSPSLS*PRNTALCHMTFAVQNFLL...CIF', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('LSTI*FCLGLWKILPRTPILMRSSCSHGHFHPPSRSRVIPRFVI*RSPFKISYS...TAS', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('EDAVIESKCGQSHMPGCCQPPGTQGCARNGYGIAPDVLQVSGPW*RFHLD*QSP...VER', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('KMQSLNQNVVSRTCPAVVSHRARRAVRVMATGSPLTFSKYQGLGNDFILIDNRH...*RG', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('RCSH*IKMWSVAHARLLSATGHAGLCA*WLRDRP*RSPSIRALVTISS*LTIAT...GRE', HasStopCodon(ExtendedIUPACProtein(), '*')) Seq('VLTHVVASDKELLARAVRWEALPSRKNLSGLHHPSAPKPLSNSQYYSKKKPIRL...DFV', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('FLHTWLLPTRSCSRVQSAGKHCQAEKTSQVCITHRRLSH*ATLNITVKKNQSVS...QTS', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('SYTRGCFRQGVARACSPLGSIAKQKKPLRSASPIGA*AIKQLSILQ*KKTNPSH...RLR', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('HEVCVSVT*QHYVLP*RTNLWGHPSSELLSRVRINC*LQLLSVLNQCSIAHHRA...CKN', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('TKSAFQ*HNNIMFFPNAQIYGDTPAPSCYHVCA*IANCNYYLCSINAV*HIIAP...CVR', HasStopCodon(ExtendedIUPACProtein(), '*')), Seq('RSLRFSNITTLCSSLTHKFMGTPQLRVAITCAHKLLTATIICAQSMQYSTSSRQ...V*E', HasStopCodon(ExtendedIUPACProtein(), '*'))]
以下是我的脚本的高度浓缩版本,以了解更多上下文:

import os
import xml.etree.ElementTree as ET
from Bio.Seq import Seq
from Bio.Alphabet import generic_dna

path_to_allxmlfiles = "path/to/xml/file/dir/"  # Path to a directory where a bunch of XML files are found.
xml_dir = os.listdir(path_to_allxmlfiles)

path_to_transcriptome = "path/to/transcriptome/file.fasta" #This is just a giant fasta file.
transcriptomefile = open(path_to_transcriptome, 'r')

List1=[]
for file in xml_dir:
    if file.endswith(".xml"):
        xml_file_path = os.path.join(path_to_allxmlfiles, file)
        xml_files = open(xml_file_path, 'r')
            for lines in xml_files:
                tree = ET.parse(xml_files)
                root = tree.getroot()

                for substring in root.findall("./BlastOutput_iterations/Iteration/Iteration_hits/Hit[1]/Hit_hsps/Hsp[1]/substring"):
                    SUBSTRING = substring.text
                    List1.append(SUBSTRING)
fullstrlist1 = []
fullstrlist2 = []
fullstrlist3 = []
fullstrlist4 = []
fullstrlist5 = []
fullstrlist6 = []
for line in transcriptomefile:
    if (stuff_was_done_here):

      A_lot_of_stuff_done_here_where_I_appended_full_strings_to_six_lists. # I am translating in 6 reading frames so this is necessary because each reading frame is unique.

        List2 = [fullstrlist1, fullstrlist2, fullstrlist3, fullstrlist4, fullstrlist5, fullstrlist6] #List2 is a combination of the six lists above.

for item in List2:
    if any(x in item for x in List1):
        print(item)
print(item)
中返回的不是包含
List1
中的子字符串的项


这是我关于StackOverflow的第一个问题。如果需要更多细节,请告诉我。我提前感谢您的帮助。

我不太确定您的要求,但这里有两种搜索方法的示例

#子字符串
列表1=[“苹果”、“桑树”]
#名单
清单2=[
[“苹果”、“葡萄柚”、“番石榴”],
[“香蕉”、“蓝莓”、“葡萄”],
[“柠檬”、“酸橙”],
[“枇杷”、“荔枝”、“芒果”],
[“桑树”、“油桃”、“草莓”],
[“石榴”、“覆盆子”]
]
#要搜索的子字符串。
列表3=[“berry”,“ime”]
打印(“搜索整个匹配字符串”,列表1)
对于清单2中的项目:
如果有(列表1中x的项目中x):
打印(项目)
打印(“\n子字符串搜索子字符串”,列表3)
对于列表2中的组:
对于组中的项目:
如果有(列表3中sbs的项目中的sbs):
打印(组)
break#无需继续搜索该组
以及输出

Search for whole matching strings ['Apple', 'Mulberry']
['Apple', 'Grapefruit', 'Guava']
['Mulberry', 'Nectarine', 'Strawberry']

 Substring search for substrings ['berry', 'ime']
['Banana', 'Blueberry', 'Grape']
['Lemon', 'Lime']
['Mulberry', 'Nectarine', 'Strawberry']
['Pomegranate', 'Raspberry']

顺便说一句,xml_文件中的
行:
是一个错误。您已经处于每个XML文件的循环中,并且希望读取整个XML文件(正如您使用
tree=ET.parse(XML_文件)所做的那样)
,除非您似乎对每个XML文件的每一行都重复此操作。除非我弄错了,并且您的每个文件的每一行都是完整的单行XML文档?…在这种情况下,该代码仍然无法工作。谢谢@ggorlen。我只是使用了
List2
的占位符名称来保持一切简单。在我的实际的脚本,
List2
有一个描述性的名称。谢谢@Zv\u oDD。我很感激你为xml\u文件中的行指出
。脚本运行得很好,就像我写出来的那样,但我会回去做一些更改,看看我的脚本中是否有wordy。这正是我需要知道的!谢谢太多了!在
print('\n Substring search for Substring',List3)
部分,而不是
print(group)
期间,我只需要
print(item)
。我正在尝试捕获整个序列,您的解决方案允许我这样做。