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

Mic*_*udl 1 python string python-2.7

假设一个字符串s可能包含几个相邻的破折号.为简单起见,让我们将这些事件中的每一个称为"重复动机".例如,以下字符串s包含五个重复的破折号动机,即长度为3,2,6,5和1.

s = "abcde---fghij--klmnopq------rstuvw-----xy-z"
Run Code Online (Sandbox Code Playgroud)

我试图提出Python代码,它返回各自的长度和每个重复动机的字符串中的相应位置.优选地,代码返回元组列表,每个元组具有格式(长度,位置).

sought_function(s)
# [(3,5), (2,13), (6,22), (5,34), (1,41)]
Run Code Online (Sandbox Code Playgroud)

您对如何启动此代码有任何建议吗?

Psi*_*dom 5

你可以使用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)]
Run Code Online (Sandbox Code Playgroud)

或者正如@Willem评论,更换sumlen:

[(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)]
Run Code Online (Sandbox Code Playgroud)