计算列表中搜索字符串的出现次数

0 投票
3 回答
2841 浏览
提问于 2025-04-18 04:35

我有以下这个列表:

data_items = ['abc','123data','dataxyz','456','344','666','777','888','888', 'abc', 'xyz']

还有一个搜索项的列表:

search = ['abc','123','xyz','456']

我想要遍历数据项,看看哪些和搜索列表里的项匹配,并建立一个简单的结构,来统计每个匹配的数量。例如:

counts = ['abc':'2', '123':'1', 'xyz':'2'.........]

这样做的最好方法是什么呢?

3 个回答

0
counts={}
for s in search:
    lower_s=s.lower()  
    counts[lower_s]=str(data_items.count(lower_s))

如果你觉得用字典可以接受的话(因为你提到过结构,所以这是个更好的选择)。

1

看起来你也需要一个部分匹配的功能。下面的代码比较简单易懂,但可能效率不是很高。而且它假设你对字典类型的结果是可以接受的。

>>> data_items = ['abc','123data','dataxyz','456','344','666','777','888','888', 'abc', 'xyz']
>>> search = ['abc','123','xyz','456']
>>> result = {k:0 for k in search}
>>> for item in data_items:
        for search_item in search:
            if search_item in item:
                result[search_item]+=1
>>> result
{'123': 1, 'abc': 2, 'xyz': 2, '456': 1}
4

你可以使用 re.searchcollections.Counter,比如:

import re
from collections import Counter

data_items = ['abc','123data','dataxyz','456','344','666','777','888','888', 'abc', 'xyz']
search = ['abc','123','xyz','456']

to_search = re.compile('|'.join(sorted(search, key=len, reverse=True)))
matches = (to_search.search(el) for el in data_items)
counts = Counter(match.group() for match in matches if match)
# Counter({'abc': 2, 'xyz': 2, '123': 1, '456': 1})

撰写回答