【问题标题】:Slicing a String and returning the spliced strings切片字符串并返回拼接后的字符串
【发布时间】:2016-07-30 20:54:28
【问题描述】:

我的函数在 8 个位置分割字符串(DNA 代码)并返回它们时遇到问题。我是 rstrip() 和 split() 函数的新手,我想我可能需要在这里使用它们,但我不太明白如何使用。

这是我的代码:

input2=open('queryfile.txt','r')

def slice_seq(a,b,c,d,e,f,g,h,query_seq):
    query_seq=input2
        slice_1=query_seq[a:b + 1]
        slice_2=query_seq[c:d + 1]
        slice_3=query_seq[e:f + 1]
        slice_4=query_seq[g:h + 1]
    return slice_1,slice_2,slice_3,slice_4

a=146
b=917
c=2381
d=2737
e=1
f=155
g=917
h=1057
answer=slice_seq(a,b,c,d,e,f,g,h,input2)
print(answer)

查询文件如下所示:

emb|AJ000012.1| Mycobacterium tuberculosis recA gene (strain Canetti)
CGAAAGGTCAGATCCGGGCCGGTGAGCACGCCGGATCCGGCCAGGCTAGCGGTGTTCAGCAGATCGTCGG
TGATCCGGACCAGCCGCGCACGCAAGTCGGGCCGCACCGCCGCCAGGGCGTTCGACGCGCCGACGAGCGC
GGACGCGATGTTGCCACACGCGGCGTGTCACACTTGAATCGAACAGGTGTTCGGCTACTGTGGTGATCAT
TCGGAGCAGCCGACTTGTCAGTGGCTGTCTCTAGTGTCACGGCCAACCGACCGATACCGGTCAATCGAAC
ACCGACCACAGGAGAGGCACCATGACGCAGACCCCCGATCGGGAAAAGGCGCTCGAGCTGGCAGTGGCCC
AGATCGAGAAGAGTTACGGCAAAGGTTCGGTGATGCGCCTCGGCGACGAGGCGCGTCAGCCGATTTCGGT
CATTCCGACCGGATCCATCGCACTCGACGTGGCCCTGGGCATTGGCGGCCTGCCGCGTGGCCGGGTGATA
GAGATATACGGCCCGGAATCTTCGGGTAAGACCACCGTGGCGCTGCACGCGGTGGCCAACGCTCAGGCCG
CCGGTGGTGTTGCGGCGTTCATCGACGCCGAGCACGCGCTGGATCCGGACTATGCCAAGAAGCTCGGTGT
CGACACCGATTCGCTGCTGGTCAGCCAGCCGGACACCGGGGAACAGGCACTCGAGATCGCCGACATGCTG
ATCCGCTCGGGTGCGCTTGACATCGTGGTGATCGACTCGGTGGCGGCGCTGGTGCCGCGCGCGGAGCTCG
AAGGCGAGATGGGCGACAGCCACGTCGGGCTGCAGGCCCGGCTGATGAGCCAGGCGCTGCGGAAAATGAC
CGGCGCGCTGAATAATTCGGGCACCACGGCGATCTTCATCAACCAGCTCCGCGACAAGATCGGAGTGATG
TTCGGGTCGCCCGAGACGACAACGGGCGGAAAGGCGTTGAAGTTCTACGCGTCGGTGCGCATGGACGTGC
GGCGGGTCGAGACGCTCAAGGACGGTACCAACGCGGTCGGCAACCGCACCCGGGTCAAGGTCGTCAAGAA
CAAGTGCCTCGCAGAGGGCACTCGGATCTTCGATCCGGTCACCGGTACAACGCATCGCATCGAGGATGTT
GTCGATGGGCGCAAGCCTATTCATGTCGTGGCTGCCGCCAAGGACGGAACGCTGCATGCGCGGCCCGTGG
TGTCCTGGTTCGACCAGGGAACGCAGGATGTGATCGGGTTGCGGATCGCCGGTGGCGCCATCGTGTGGGC
GACACCCGATCACAAGGTGCTGACAGAGTACGGCTGGCGTGCCGCCGGGGAACTCCGCAAGGGAGACCGG
GTGGCGCAACCGCGACGCTTCGACGGATTCGGTGACAGTGCGCCGATTCCGGCGGATCATGCCCGGCTGC
TTGGCTACCTGATCGGAGATGGCAGGGATGGTTGGGTGGGGGGCAAGACTCCGATCAACTTCATCAATGT
TCAGCGGGCGCTCATTGACGACGTGACGCGAATCGCTGCGACGCTCGGTTGTGCGGCCCATCCGCAGGGG
CGTATCTCACTCGCGATCGCTCATCGACCCGGTGAGCGCAACGGGGTACTGGACCTTTGTCGGCGGGCCG
GTGTGCACGGCAAGCTCGCGTGGGAGAAGACGATTCCGAATTGGTTCTTCGAGCCGGACATCGCGGCCGA
CATTGTCGGCAATCTGCTCTTCGGCCTGTTCGAAAGCGACGGGTGGGTGAGCCGGGAACAGACCGGGGCA
CTTCGGGTCGGTTACACGACGACCTCTGAACAACTCGCGCATCAGATTCATTGGCTGCTGCTGCGGTTCG
GTGTCGGGAGCACCGTTCGAGATTACGATCCGACCCAGAAGCGGCCGAGCATCGTCAACGGTCGACGGAT
CCAGAGCAAACGTCAAGTGTTCGAGGTCCGGATCTCGGGTATGGATAACGTCACGGCATTCGCGGAGTCA
GTTCCCATGTGGGGGCCGCGCGGTGCCGCGCTTATCCAGGCGATTCCAGAAGCCACGCAGGGGCGGCGTC
GTGGATCGCAAGCGACATATCTGGCTGCAGAGATGACCGATGCCGTGCTGAATTATCTGGACGAGCGCGG
CGTGACCGCGCAGGAGGCCGCGGCCATGATCGGTGTAGCTTCCGGGGACCCCCGCGGTGGAATGAAGCAG
GTCTTAGGTGCCAGCCGCCTTCGTCGGGATCGCGTGCAGGCGCTCGCGGATGCCCTGGATGACAAATTCC
TGCACGACATGCTGGCGGAAGAACTCCGGTATTCGGTGATCCGAGAAGTGCTGCCAACGCGGCGGGCACG
AACGTTCGACCTCGAGGTCGAGGAACTGCACACCCTCGTCGCCGAAGGGGTTGTCGTGCACAACTGTTCG
CCCCCCTTCAAGCAGGCCGAGTTCGACATCCTCTACGGCAAGGGAATCAGCAGGGAGGGCTCGCTGATCG
ACATGGGTGTGGATCAGGGCCTCATCCGCAAGTCGGGTGCCTGGTTCACCTACGAGGGCGAGCAGCTCGG
CCAGGGCAAGGAGAATGCCCGCAACTTCTTGGTGGAGAACGCCGACGTGGCTGACGAGATCGAGAAGAAG
ATCAAGGAAAAGCTTGGCATTGGTGCCGTGGTGACCGATGACCCCTCAAATGACGGTGTCCTGCCCGCCC
CCGTCGACTTCTGAGCGCGAAGAGCAGGCGCGGGCACTGTGCCTGCGCCTGCTCACCGCGCGATCCCGCA
CCCGCGC

任何帮助将不胜感激!我很确定我的问题是如何处理查询文件,以便函数可以识别它并对其进行切片?

【问题讨论】:

  • 这叫切片而不是'拼接'。
  • 你的代码中的 input1 是什么?
  • 哎呀,感谢您指出 Dhruv。
  • 你想要的输出是什么?
  • 您要跳过文件中的标题,还是切片索引会考虑它?

标签: python string function split slice


【解决方案1】:

在函数slice_seq 中,删除query_sec = input2 行。这引发了一个错误。您还没有在函数中创建一个名为input2 的变量,也没有这样命名的参数。这是引发错误。您不能将函数中的变量设置为另一个变量。您必须先全球化另一个变量。

【讨论】:

    【解决方案2】:

    我不清楚结果应该是 4 片还是 8 片。下面是对您的代码进行概括的尝试。此代码返回列表列表中的 4 个切片。第一个切片来自 a->b,第二个切片来自 c->d,第三个切片来自 e->f,第四个切片来自 g->h。

    def slice_seq(slice_positions, filename):
        with open(filename, 'r') as myfile:
            data=myfile.read().replace('\n', '')
            slice_out = [data[slice[0]:slice[1]+1] for slice in slice_positions]
        return slice_out
    
    slice_positions = [(146, 917), (2381, 2737), (1, 155), (917, 1057)]
    filename = 'queryfile.txt'
    slice_out = slice_seq(slice_positions, filename)
    print(slice_out)
    

    a->b 的切片是:

    slice_out[0]
    

    来自 c-d 的切片是:

    slice_out[1]
    

    以此类推。

    【讨论】:

    • 我会使用list comprehensionslice_out = [data[slices[0]:slices[1]+1] for slices in slice_len]。为了使其更具可读性,还将重命名参数 slice_len -> slices 并使用 slice_out = [data[slice[0]:slice[1]+1] for slice in slices]
    • 感谢@martineau 我已按照您的建议进行了编辑
    【解决方案3】:

    我想你不是那么热衷于在该文件中分割标题,所以你必须先跳过它,一种或另一种方式:

    with open('queryfile.txt') as input2:
        # Consume the header
        next(input2)  # or input2.readline()
    

    然后该函数必须逐行读取文件到一个字符串,同时删除换行符:

    dna = ''.join(row.strip() for row in query_seq)
    

    我还建议稍微改变一下将切片索引传递给函数的方式:

    def slice_seq(query_seq, *slices):
    

    这样,您的函数接受 0 个或多个切片作为位置参数,切片在这里是索引的元组。把它们放在一起你会得到:

    def slice_seq(query_seq, *slices):
        # feel free to use rstrip, if strip seems redundant
        dna = ''.join(row.strip() for row in query_seq)
        return [dna[a:b + 1] for a, b in slices]
    
    a=146
    b=917
    c=2381
    d=2737
    e=1
    f=155
    g=917
    h=1057
    
    with open('queryfile.txt') as input2:
        next(input2)
        answer = slice_seq(input2, (a, b), (c, d), (e, f), (g, h))
    
    print(*answer, sep='\n')
    

    【讨论】:

    • 这太好了,谢谢!正在努力处理如何处理查询文件中的行。 sep='\n' 到底是什么,我认为这就是在我的输出中添加新行的原因?我以前从未见过。
    • print在打印时用来分隔多个参数的分隔符,简称sep。它默认为一个空格。函数调用上下文中的星号unpacks the list as positional arguments to print.
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多