确定字符串中重复字符的长度和位置

2024-10-01 07:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

假设字符串s可能包含多个相邻的破折号。为了简单起见,让我们把这些事件都称为“重复动机”。例如,下面的字符串s包含五个重复的破折号,即长度为3、2、6、5和1

s = "abcde---fghij--klmnopq------rstuvw-----xy-z"

我正在尝试用Python代码返回每个重复序列的字符串中各自的长度和位置。代码优先返回元组列表,每个元组的格式(长度、位置)

sought_function(s)
# [(3,5), (2,13), (6,22), (5,34), (1,41)]

你对如何启动这个代码有什么建议吗


Tags: 字符串代码列表格式事件序列元组动机
3条回答

如果可以使用numpy:

import numpy as np
a = "abcde---fghij--klmnopq------rstuvw-----xy-z"
bool_vec = np.array([letter == "-" for letter in a])
dots = np.where(np.diff(bool_vec)!=0)[0] + 1
number = np.diff(dots.reshape((-1,2)),1).ravel()
idx = dots[::2]

使用numberidx两个包含所需内容的数组:)

您可以使用groupby

s = "abcde---fghij--klmnopq------rstuvw-----xy-z"
from itertools import groupby
[(next(g)[0], sum(1 for _ in g) + 1) for k, g in groupby(enumerate(s), lambda x: x[1]) if k == "-"]
# [(5, 3), (13, 2), (22, 6), (34, 5), (41, 1)]

或者像@Willem评论的那样,用len替换sum

[(next(g)[0], len(list(g)) + 1) for k, g in groupby(enumerate(s), lambda x: x[1]) if k == "-"]
# [(5, 3), (13, 2), (22, 6), (34, 5), (41, 1)]

如果要编写自己的函数:只需对字符进行迭代,并在内存中保留当前长度,如果序列被切断,则生成元素:

def find_sequences(s,to_find):
    result = []
    lng = 0
    for i,c in enumerate(s):
        if c == to_find:
            lng += 1
        else:
            if lng:
                result.append((lng,i-lng))
            lng = 0
    if lng:
        result.append((lng,i-lng))
    return result

所以s是字符串,to_find是您感兴趣的字符(这里是'-'

相关问题 更多 >