所以我有一个字符串列表:
list1 = ["1thing", "2thing", "3thing", "1thing"]
我想知道每个人在列表中出现了多少次。问题是,我只想比较前几个字符,因为我知道如果第一个,比如 3 个字符相同,那么整个字符串是相同的。我在想我可以修改内置的 list.count(x) 方法,或者我可以覆盖__eq__
运算符,但我不确定如何执行其中任何一个。
使用生成器提取前几个字符,并在其collections.Counter
上使用内置类:
Counter(item[:2] for item in list1)
为什么要经历所有的麻烦......使用collections.Counter
模块来查找频率。
>>> import collections
>>> x=['1thing', '2thing', '1thing', '3thing']
>>> y=collections.Counter(x)
>>> y
Counter({'1thing': 2, '2thing': 1, '3thing': 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}
此解决方案使您对结果有更多的灵活性。例如,修改返回行以返回grouped
或list(grouped)
允许您轻松获取匹配的对象。