如何在一个字符串中连续地计算字符的频率?

3

input = 'XXYXYYYXYXXYYY'

输出 = [2,1,1,3,1,1,2,3]

如何按照输入顺序统计字符串中X和Y的数量,并将这些值放入列表中?


你可以像列表中的项一样访问字符串中的字符。 - marxmacher
1
你尝试过什么? - Laurent H.
这个问题与其他问题不同,因为它只涉及两个字符X和Y,并且不需要跟踪出现次数。OP的示例允许比答案指向的更多的创造性解决方案。 - ShpielMeister
8个回答

3
import itertools
numbers = []
input = 'XXYXYYYXYXXYYY'
split_string = [''.join(g) for k, g in itertools.groupby(input)]

for i in split_string:
    numbers.append(len(i))
print(numbers)

输出:

[2, 1, 1, 3, 1, 1, 2, 3]

你可以通过使用sum(1 for _ in g)替换字符串连接来一次性完成。 - Masklinn

2
你可以使用 while 循环遍历整个列表来实现此操作。
str = 'XXYXYYYXYXXYYY';
i = 0
output = []
k = 1
while i < len(str) - 1:
   if str[i] == str[i+1]:
      k = k + 1
   else:
      output.append(k)
      k = 1
   i = i + 1
output.append(k)
print(output)

输出

[2, 1, 1, 3, 1, 1, 2, 3]

2

尝试使用 itertools.groupby

from itertools import groupby
s = 'XXYXYYYXYXXYYY'
print([len(list(i)) for _, i in groupby(s)])

1

使用正则表达式的简短解决方案

import re
s = 'XXYXYYYXYXXYYY'
l = [len(m.group()) for m in re.finditer(r'(.)\1*', s)]

根据 这个答案

0

以下是您可以尝试的内容

test = 'XXYXYYYXYXXYYY'
count = 1
result_list = list()
prev_char = test[0]
for char in test[1:]:
    if char == prev_char:
        count+=1
        prev_char = char
    else:
        result_list.append(count)
        count=1
        prev_char = char
result_list.append(count)
print(result_list)

输出

[2, 1, 1, 3, 1, 1, 2, 3]

0

如果没有任何库,它会是这样的:

string = 'XXYXYYYXYXXYYY'

res = []
current = ''
for char in string:
    if current == char:
        res[-1] += 1
    else:
        res.append(1)
    current = char

print('res', res) # [2,1,1,3,1,1,2,3]

0

试试这个。

input1 = 'XXYXYYYXYXXYYY'
output_list = []

count = 1

for index in range(len(input1)-1):
    if input1[index] == input1[index+1]:
        count += 1
    else:
        output_list.append(count)
        count = 1

if input1[-1] == input1[-2]:
    output_list[-1] += 1
else:
    output_list.append(1)
print(output_list)

0

基本的方法是在出现新字符时停止。以下是代码。

list_of_consec = []
def consec_occur(strr):
    i = 0
    cc = []
    while ( i < len(strr) -1 ):
        count =1
        while strr[i] == strr[i+1]:
            i += 1
            count += 1
            if i + 1 == len(strr):
                break
        cc.append(count)
        i += 1
    return (cc)
if __name__ == "__main__":
    print(consec_occur('XXYXYYYXYXXYYY'))

您可以根据需要更改代码。如果您想要列表,则将cc设置为全局变量并删除return语句,在print语句中使用cc。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接