在Python列表中查找连续重复的字符串

2 投票
2 回答
1594 浏览
提问于 2025-04-18 18:08

在Python列表中,找出连续重复的字符串最有效的方法是什么?

举个例子,假设我有一个列表:["a", "a", "b", "c", "b", "b", "b"]。我想要的输出结果是类似这样的:["在索引0找到2个a的组,在索引4找到3个b的组"]

有没有什么内置的函数可以完成这个任务呢?我找到过一个叫numpy.bincount的东西,但好像只适用于数字。

提前感谢你的帮助。

2 个回答

1

这个需要在循环的每个元素之间保持状态信息,所以用列表推导式来做并不简单。相反,你可以在循环中记录上一个值:

groups = []
for i, val in enumerate(["a", "a", "b", "c", "b","b","b"]):
    if i == 0:
         cnt = 1
         loc = i
         last_val = val
    elif val == last_val:
         cnt += 1
    else:
         groups.append((cnt, last_val, loc))
         cnt = 1
         loc = i
         last_val = val

for group in groups:
     print("group of {0} {1}'s found at index {2}".format(*group)

输出结果:

group of 2 a's found at index 0
group of 1 b's found at index 2
group of 1 c's found at index 3
10

你叫它“组”真有意思,因为最适合这个的函数是 itertools.groupby

>>> import itertools
>>> items = ["a", "a", "b", "c", "b", "b", "b"]
>>> [(k, sum(1 for _ in vs)) for k, vs in itertools.groupby(items)]
[('a', 2), ('b', 1), ('c', 1), ('b', 3)]

(顺便说一下,sum(1 for _ in vs) 是在计数,因为 len 不能在任何可迭代对象上使用,而 len(list(…)) 是浪费资源。)

获取索引稍微复杂一点;我会用循环来实现。

import itertools

def group_with_index(l):
    i = 0

    for k, vs in itertools.groupby(l):
        c = sum(1 for _ in vs)
        yield (k, c, i)
        i += c

撰写回答