统计列表中相同长度的项

1 投票
2 回答
1294 浏览
提问于 2025-04-17 07:34

我正在尝试用更符合Python风格的方式来移植一个cgi脚本。

sequence = "aaaabbababbbbabbabb"
res = sequence.split("a") + sequence.split("b")
res = [l for l in res if l]

结果是

>>> res
['bb', 'b', 'bbbb', 'bb', 'bb', 'aaaa', 'a', 'a', 'a', 'a']

这个在C语言中大约有100行代码。现在我想高效地统计一下res列表中相同长度的元素数量。例如,这里res包含5个长度为1的元素,3个长度为2的元素,以及2个长度为4的元素。

问题是,这个序列字符串可能会非常大。

2 个回答

1

你可以试试这样做:

occurrences_by_length={} # map of length of string->number of strings with that length.
for i in (len(x) for x in (sequence.split("a")+sequence.split("b"))):
    if i in occurrences_by_length:
        occurrences_by_length[i]=occurrences_by_length[i]+1
    else:
        occurrences_by_length[i]=1

现在,occurrences_by_length 这个东西记录了每个字符串的长度和这个长度的字符串出现的次数。

7

生成一个字符串长度的直方图,最简单的方法是使用 collections.Counter 这个工具:

>>> from collections import Counter
>>> a = ["a", "b", "aaa", "bb", "aa", "bbb", "", "a", "b"]
>>> Counter(map(len, a))
Counter({1: 4, 2: 2, 3: 2, 0: 1})

补充说明: 还有一种更好的方法可以找到相同字符的连续出现,叫做 itertools.groupby()

>>> sequence = "aaaabbababbbbabbabb"
>>> Counter(len(list(it)) for k, it in groupby(sequence))
Counter({1: 5, 2: 3, 4: 2})

撰写回答