计算列表中搜索字符串的出现次数
我有以下这个列表:
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.search
和 collections.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})