我参与了一项计划,该计划可以计算给定数据集中的字母数量,该数据集以>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
来使该计划正常运行,但在此网站上遇到困难并研究了许多问题和答案,只是为了深入挖掘漏洞。 ..有人可以帮帮我吗?
答案 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}))