我想知道,如果我有一个从文本文件中读取的字符串,那么将它分成5个字符组的最有效方法是什么?例如:
我有一个名为dna.txt的文本文件,其内容为:
>human
ACCGTGAAAAACGTGAGTATA
>mouse
ACCAAAAGTGTAT
然后我有一个Python脚本,它将存储文本文件的第2行和第4行。
import linecache
f = open("dna.txt")
sequence_1 = linecache.getline('dna.txt', 2)
sequence_2 = linecache.getline('dna.txt', 4)
f.close()
目标是打印出程序:
>human
ACCGT
GAAAA
ACGTG
AGTAT
A
>mouse
ACCAA
AAGTG
TAT
就像我之前说过的那样,我一直试图想出一种打破2弦的有效方法,但没有运气。非常感谢帮助,谢谢!
答案 0 :(得分:3)
这应该让你开始:
human = "ACCGTGAAAAACGTGAGTATA"
print(' '.join(human[i:i+5] for i in range(0, len(human), 5)))
很容易将其概括为一个生成器,它将human
和5
作为参数并生成子字符串:
def splitn(s, n):
for i in range(0, len(s), n):
yield s[i:i+n]
print(' '.join(splitn("ACCGTGAAAAACGTGAGTATA", 5)))
答案 1 :(得分:1)
>>> human = 'ACCGTGAAAAACGTGAGTATA'
>>> mouse = 'ACCAAAAGTGTAT'
>>> import re
>>> def format_dna(s):
... return re.sub(r'(.{5})(?!$)', r'\g<1>\n', s)
...
>>> print(format_dna(human))
ACCGT
GAAAA
ACGTG
AGTAT
A
>>> print(format_dna(mouse))
ACCAA
AAGTG
TAT
re.sub
在字符串中执行正则表达式替换。
(.{5})(?!$)
是要匹配的模式。 \g<1>\n
是替代的模式。
.{5}
匹配任意五个字符。使用parens (.{5})
它是一个捕获组。
$
匹配字符串的结尾。 (?!$)
是一个负面的先行断言。如果字符串的长度是五的倍数(这会导致在字符串末尾添加不需要的换行符),这可以防止模式匹配最后一个组。
\g<1>
是一个反向引用,指向第一个(也是唯一的)捕获组。
所以这说:当你连续看到五个字符(不是最后五个字符)时,用五个字符加一个换行符替换它们。
答案 2 :(得分:0)
在使用之前,请查看我在撰写本文时发布的其他答案。 这是一种简单且非常次优的算法。
效率不高但你可以通过简单的循环来实现。
str = "abcdefghijlkmnopqrstuvwxyz"
length = len(str)
i = 0
subs = []
while (i < length):
subs[i/5] = str[i:i+5]
i += 5
这应该以包含五个字符的每个subs索引结束。
答案 3 :(得分:0)
在较旧版本的Python中,您可以使用生成器表达式或列表解析相当容易地完成此操作。对于字符串中的任何字符串s
和索引i
,表达式s[i:i+5]
将从位置s
开始计算为最大长度为5的i
子字符串。< / p>
如果i+5
恰好指向字符串末尾,则切片表示法会方便地抑制任何索引错误,只返回它可以使用的最长字符串。
所以表达式
[sequence_1[i:i+5] for i in range((0, len(sequence_1), 5)]
应该为您提供所需子串的列表。
答案 4 :(得分:0)
>>> def groupdna(long_seq,size=5):
... groups = itertools.izip_longest(*[iter(long_seq)]*size,fillvalue="")
... return list(map("".join,groups))
...
>>> groupdna(human,5)
['ACCGT', 'GAAAA', 'ACGTG', 'AGTAT', 'A']
>>> groupdna(mouse,5)
['ACCAA', 'AAGTG', 'TAT']
>>>
是一种有趣的方式:P
答案 5 :(得分:0)
In [1]: import re
In [2]: s = "ACCGTGAAAAACGTGAGTATA"
In [3]: print("\n".join(re.findall("\w{5}|\w+",s)))
ACCGT
GAAAA
ACGTG
AGTAT
A
re.findall("\w{5}|\w+",s)
找到5个字符或一个或多个字符。
一些时间:
In [72]: %timeit "\n".join(groupdna(s,5))
100000 loops, best of 3: 3.5 µs per loop
In [73]: timeit ('\n'.join(splitn(s, 5)))
100000 loops, best of 3: 2.22 µs per loop
In [74]: %timeit re.sub(r'(.{5})(?!$)', r'\g<1>\n', s)
100000 loops, best of 3: 5.24 µs per loop
In [75]: %timeit ("\n".join(re.findall("\w{5}|\w+",s)))
100000 loops, best of 3: 2.16 µs per loop