3

所以我有一个字符串列表:

list1 = ["1thing", "2thing", "3thing", "1thing"]

我想知道每个人在列表中出现了多少次。问题是,我只想比较前几个字符,因为我知道如果第一个,比如 3 个字符相同,那么整个字符串是相同的。我在想我可以修改内置的 list.count(x) 方法,或者我可以覆盖__eq__运算符,但我不确定如何执行其中任何一个。

4

3 回答 3

9

使用生成器提取前几个字符,并在其collections.Counter上使用内置类:

Counter(item[:2] for item in list1)
于 2012-05-01T19:57:58.323 回答
5

为什么要经历所有的麻烦......使用collections.Counter模块来查找频率。

>>> import collections
>>> x=['1thing', '2thing', '1thing', '3thing']
>>> y=collections.Counter(x)
>>> y
Counter({'1thing': 2, '2thing': 1, '3thing': 1})
于 2012-05-01T19:57:05.203 回答
1

可能不如@Marcin 的解决方案好,但使用itertools.groupby它可能会使其更具可读性和灵活性。

from itertools import groupby

def group_by_startswith(it, n):
    """Get a dict mapping the first n characters to the number of matches."""

    def first_n(str_):
        return str_[:n]

    startswith_sorted = sorted(it, key=first_n)
    groups = groupby(startswith_sorted, key=first_n)

    return {key: len(list(grouped)) for key, grouped in groups}

示例输出:

>>> list1 = ["1thing", "2thing", "3thing", "1thing"]
>>> print(group_by_startswith(list1, 3))
{'3th': 1, '2th': 1, '1th': 2}

此解决方案使您对结果有更多的灵活性。例如,修改返回行以返回groupedlist(grouped)允许您轻松获取匹配的对象。

于 2012-05-01T20:53:04.270 回答