Python-将具有空格的字符串的大写和小写元素的遗传数据拆分为列表

时间:2019-03-03 01:35:25

标签: python python-3.x

我正在处理大量遗传数据的过滤。为了便于参考,我们将使用一串较短的元素,例如:

geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'

我想将此字符串拆分为单词形式的所有大写字母的列表(并最终包含小写字母的部分),所以这是我需要的输出:

cleanedExons = ['GGCCTATAACA', 'CTACATTGGA', 'ATTAAGGAA']

这类似于我过去从句子中拆分单词的方式,我一直在尝试修改代码以将字符串拆分为列表,但收效甚微。这是我当前的代码:

def Exon_Split(string):
    IntronLetters = 'gcat'
    L=string.split(IntronLetters)
    cleanedExons=[]
    ExonLetters = 'GCAT'

    for e in L:
        word = ''
        for c in e:
            if c in ExonLetters:
                word += c
        if word!=ExonLetters:
            cleanedExons.append(word)
    print(cleanedExons)
Exon_Split(geneData)

这是我得到的输出。如您所见,它不会被拆分为所需的元素:

['GGCCTATAACACTACATTGGAATTAAGGAA']

有没有办法让python将这些大写字母视为“单词”?

2 个答案:

答案 0 :(得分:1)

有问题吗?使用正则表达式:

import re

geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'
pU = re.compile('[A-Z]+')
pL = re.compile('[a-z]+')
cleanedExons = pU.findall(geneData)
# repeat with PL

我无聊地做了一些性能测试:

# 10000000 iterations
# regex split: 40.23s
# regex findall: 26.53s
# the itertool version posted in another answer: 163.82s

所以re.findall是赢家。 findall的赠送金额转到@ Tomothy32,我发布的初始版本是split

答案 1 :(得分:1)

使用itertools.groupby是一种方法:

import itertools

geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'

cleanedExons = [''.join(g) for k, g in itertools.groupby(geneData, key=str.isupper) if k]
print(cleanedExons)
# ['GGCCTATAACA', 'CTACATTGGA', 'ATTAAGGAA']

对于小写字母,只需将str.isupper更改为str.islower