Python 如何对文本/字符进行拆分和排序?

Python 如何对文本/字符进行拆分和排序?,python,Python,这可能很容易做到,但作为一个初学者,它似乎对我来说微不足道 我有这样的文本或包含以下文本的文件: 'fdhdhjduvduvfbvhufbvufvhifbusdbjhkbueigvuerafvguavgugvg' 如何使用Python拆分文本,如下所示: 'fdh dhj duv duv fbv huf bvu fvh ifb usd bjh kbu eig vue raf vgu avg ugvg' 'f dhd hjd uvd uvf bvh ufb vuf vhi fbu sdb jhk

这可能很容易做到,但作为一个初学者,它似乎对我来说微不足道

我有这样的文本或包含以下文本的文件:

'fdhdhjduvduvfbvhufbvufvhifbusdbjhkbueigvuerafvguavgugvg'
如何使用Python拆分文本,如下所示:

'fdh dhj duv duv fbv huf bvu fvh ifb usd bjh kbu eig vue raf vgu avg ugvg'
'f dhd hjd uvd uvf bvh ufb vuf vhi fbu sdb jhk bue igv uer afv gua vgu gvg'
'fd hdh jdu vdu vfb vhu fbv ufv hif bus dbj hkb uei gvu era fvg uav gug vg'
然后需要计算三个序列的频率(例如有多少“fdh”)并对所有最频繁的序列进行排序

我在这里看到了答案:

但我不知道哪一个对我有好处。我还需要打开一个包含文本的文件并写入另一个文件。请给我一个专家意见

编辑:

with open(fasta, 'r') as fin, open(outfile, 'w') as fout:
        for item in Counter(s[i:i+4] for i in range(len(fin))).most_common():
            fout.write(item)

给我一个错误

TypeError: object of type '_io.TextIOWrapper' has no len()

使用正则表达式将字符串拆分为3个块,然后使用字典理解生成一个dict,该dict统计每个块的出现次数

import re

chunked = re.findall('...', your_string)
result = {key: chunked.count(k) for key in set(chunked)}
编辑:要在不使用正则表达式的情况下进行分块,并捕获将字符串划分为3个块的不同方法,请使用列表理解:

chunked = [your_string[i:i+3] for i in xrange(len(your_string))]
这是不雅观的,但要处理
'f'
'fd'
情况,您只需将它们连接到
分块的末尾即可:

chunked = [your_string[i:i+3] for i in xrange(len(your_string))] + [your_string[:1], your_string[:2]]
然后像前面一样应用字典理解:

result = {key: chunked.count(k) for key in set(chunked)}
结果:

{'afv': 1,
'avg': 1,
'bjh': 1,
'bue': 1,
'bus': 1,
'bvh': 1,
'bvu': 1,
'dbj': 1,
'dhd': 1,
'dhj': 1,
'duv': 2,
'eig': 1,
'era': 1,
'f': 1,
'fbu': 1,
'fbv': 2,
'fd': 1,
'fdh': 1,
'fvg': 1,
'fvh': 1,
'g': 1,
'gua': 1,
'gug': 1,
'gvg': 1,
'gvu': 1,
'hdh': 1,
'hif': 1,
'hjd': 1,
'hkb': 1,
'huf': 1,
'ifb': 1,
'igv': 1,
'jdu': 1,
'jhk': 1,
'kbu': 1,
'raf': 1,
'sdb': 1,
'uav': 1,
'uei': 1,
'uer': 1,
'ufb': 1,
'ufv': 1,
'ugv': 1,
'usd': 1,
'uvd': 1,
'uvf': 1,
'vdu': 1,
'vfb': 1,
'vg': 1,
'vgu': 2,
'vhi': 1,
'vhu': 1,
'vue': 1,
'vuf': 1}

这可能对您有用:对于频率计数,请尝试
collections.Counter
。您可以在几乎任何Python教程中学习如何读取和写入文件,例如one。看起来您希望算法(或三角形更加具体)。Python有一个n-gram模块,我从这里开始。
fin
是一个文件对象,没有长度。修改为
fin.read()
谢谢你解决了这个问题我已经试过你的代码了。它只显示第一个。我还需要第二个和第三个。我怎么能做到呢?我已经修改了答案来处理那些案子,只使用“纯”Python。但如果我想这样打印:“fdh dhj duv duv fbv huf bvu fvh ifb usd bjh kbu eig vue raf vgu avg ugv”“dhd hjd uvd uvd uvf bvh ufb VUFF vhi fbu sdb jhk bue igv uer afv gua vgu gvg”“hdh jdu vdu vfb vhu fbv hif bus dbj hkb uei gvu era FVGU GU GUGG”我需要包括哪些修改?
>>> from collections import Counter
>>> s = 'fdhdhjduvduvfbvhufbvufvhifbusdbjhkbueigvuerafvguavgugvg'
>>> for item in Counter(s[i:i+3] for i in range(len(s))).most_common():
...     print item
... 
('fbv', 2)
('vgu', 2)
('duv', 2)
('raf', 1)
('fbu', 1)
('dbj', 1)
('uei', 1)
('bvu', 1)
('vg', 1)
('bjh', 1)
('hjd', 1)
('bvh', 1)
('uvd', 1)
('ugv', 1)
('uvf', 1)
('kbu', 1)
('igv', 1)
('usd', 1)
('dhj', 1)
('fvh', 1)
('fvg', 1)
('dhd', 1)
('gvg', 1)
('afv', 1)
('uer', 1)
('gvu', 1)
('huf', 1)
('eig', 1)
('bus', 1)
('ufb', 1)
('avg', 1)
('sdb', 1)
('hif', 1)
('hkb', 1)
('gug', 1)
('uav', 1)
('ufv', 1)
('bue', 1)
('vuf', 1)
('gua', 1)
('vue', 1)
('vdu', 1)
('g', 1)
('vhu', 1)
('fdh', 1)
('jhk', 1)
('vfb', 1)
('vhi', 1)
('era', 1)
('ifb', 1)
('jdu', 1)
('hdh', 1)