Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对按顺序出现的相同字符进行计数_Python - Fatal编程技术网

Python 对按顺序出现的相同字符进行计数

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

我试图以文件格式返回最常用的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(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")