从某些字符串开始迭代一些数据块

时间:2016-06-13 15:05:01

标签: python loops if-statement

我参与了一项计划,该计划可以计算给定数据集中的字母数量,该数据集以>chrome开头,后跟长字母(a,b,c,d at random)。 数据块看起来完全如下:

("\n" shows space in the command line): ">chrome0001"\n"abcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011" \n"bbbbadbcbabdbaaaadbcbddcdda>chrome0111"\n" .... (the total number of ">chrome" is 10)."

我想计算每个>chrome后出现的字母数。预期的输出应该是:

>>chrome0001 a:4 b:6 c:10 d: 11

我一直在考虑是否可以使用\n>chrome来使该计划正常运行,但在此网站上遇到困难并研究了许多问题和答案,只是为了深入挖掘漏洞。 ..有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

这是一个相对简单的解析问题。首先,您希望将字符串拆分为chromeXYZ\n位,并使用以下字符串对其进行分组。我们可以使用正则表达式相当容易地做到这一点 - 如果我正确理解您的输入,这是有效的:

>>> import re
>>> s = ">chrome0001\nabcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011\nbbbbadbcbabdbaaaadbcbddcdda>chrome0111\n"
>>> re.findall(r'(>chrome\d+\n)([^>]+)', s)
[('>chrome0001\n', 'abcdbadbcbdabdcbdbbbbadbcbbdab'), ('>chrome0011\n', 'bbbbadbcbabdbaaaadbcbddcdda')]

正则表达式是直截了当的(至少就正则表达式而言......):

  • (>chrome\d+\n) - "> chrome",某些数字和换行符
  • ([^>]+) - 匹配所有字符,直到下一个>或输入结束。

从这里开始,计算子序列中的字符数相当容易。您可以使用collections.Counter进行繁重的工作:

>>> from collections import Counter
>>> for chrome, alpha in re.findall(r'(>chrome\d+\n)([^>]+)', s):
...   print(chrome, Counter(alpha))
... 
('>chrome0001\n', Counter({'b': 14, 'd': 7, 'a': 5, 'c': 4}))
('>chrome0011\n', Counter({'b': 10, 'a': 7, 'd': 7, 'c': 3}))