Python 对按顺序出现的相同字符进行计数
我试图以文件格式返回最常用的x字符。例如,此函数应返回[4,1,2] 例如,如果字符串是XXXXX YXYXXX',它应该返回[5,2,3]Python 对按顺序出现的相同字符进行计数,python,Python,我试图以文件格式返回最常用的x字符。例如,此函数应返回[4,1,2] 例如,如果字符串是XXXXX YXYXXX',它应该返回[5,2,3] 我的函数没有返回正确的列表。任何帮助都将不胜感激。谢谢,您没有初始化序列之间的total值,因此它会继续计数 def count_squences(string): i= 0 total = 0 total_char_list = [] while i < len(string): print(s
我的函数没有返回正确的列表。任何帮助都将不胜感激。谢谢,您没有初始化序列之间的total值,因此它会继续计数
def count_squences(string):
i= 0
total = 0
total_char_list = []
while i < len(string):
print(string[i])
if string[i] == "x":
total += 1
if string[i] == "y":
total_char_list.append(total)
total = 0
i = i + 1
return total_char_list
print(count_squences("xxxxyyxyxx"))
当您遇到y字符时,您不会重置计数器,并且如果在您找到y字符时至少有一个x字符计数,则您只应将y字符附加到total_char_列表中。y字符也可以重复:
my_str = "xxxxyyxyxx"
[len(z) for z in re.split("y+", my_str)]
接下来,您确实需要使用for循环来循环序列。您可以通过以下方式获得单个字符:
while ...:
# ...
if total:
# x characters at the end
total_char_list.append(total)
您可以通过以下方式加快速度:
groupby将一个iterable输入(如字符串)划分为每个组的独立迭代器,其中组定义为具有相同keyvalue结果的任何连续值。默认键函数只返回值,因此groupbystring为您提供相同的连续字符组。char是重复的字符,组中u的sum1采用迭代器的长度
然后可以使其更通用,并计算所有组:
from itertools import groupby
def count_squences(string):
return [sum(1 for _ in group) for char, group in groupby(string) if char == 'x']
正则表达式也可以这样做:
def count_all_sequences(string):
counts = {}
for char, group in groupby(string):
counts.setdefault(char, []).append(sum(1 for _ in group))
return counts
编辑函数格式:
import re
def count_all_sequences(string):
counts = {}
# (.)(\1*) finds repeated characters; (.) matching one, \1 matching the same
# This gives us (first, rest) tuples, so len(rest) + 1 is the total length
for char, group in re.findall(r'(.)(\1*)', string):
counts.setdefault(char, []).append(len(group) + 1)
return counts
返回[4,1,2]什么不起作用?def count_xs:return[lent for t in re.findall'x+',s]也将完成您想要的功能。当有连续的y字符时,这将附加多个零。感谢@MartijnPieters,我修复了它+另一个修复
from itertools import groupby
def count_squences(string):
return [sum(1 for _ in group) for char, group in groupby(string) if char == 'x']
def count_all_sequences(string):
counts = {}
for char, group in groupby(string):
counts.setdefault(char, []).append(sum(1 for _ in group))
return counts
import re
def count_all_sequences(string):
counts = {}
# (.)(\1*) finds repeated characters; (.) matching one, \1 matching the same
# This gives us (first, rest) tuples, so len(rest) + 1 is the total length
for char, group in re.findall(r'(.)(\1*)', string):
counts.setdefault(char, []).append(len(group) + 1)
return counts
def count_sequences(string):
return [len(x) for x in re.findall(r"x+", string)]
count_sequences("xxxxyyxyxx")