【问题标题】:count occurrences of search strings in a list [duplicate]计算列表中搜索字符串的出现次数[重复]
【发布时间】:2014-04-28 13:49:23
【问题描述】:

我有以下清单:

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

我有一个搜索项目列表:

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

我想使用搜索列表遍历 data_items 以进行匹配,并构建一个基本结构,为每个匹配项提供计数。例如

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

最好的方法是什么?

【问题讨论】:

标签: python list search


【解决方案1】:

您可以使用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})

【讨论】:

  • 这段代码对data_items 中的每个元素迭代一次search,即如果data_items 很长并且search 中的元素不止一个,则它的性能可能会很差。或者也许 Python 做了某种循环融合? :-)
  • @FrerichRaabe 它只搜索一次,而不是为每个 search 检查每个 data_item... 正则表达式引擎可能会优化 |'d 候选人(但我不是100% 肯定)- 至少它不应该比嵌套循环和匹配结构中断更非性能......
  • 哎呀,你当然是对的,我不小心评论了错误的答案(我的评论是为了给 GammaAmino 的答案)!
  • 现在我重新阅读了您的代码,我认为 to_search 部分应该确保转义特殊(就正则表达式引擎而言)字符,即它应该读取类似 @987654332 的内容@
  • @FrerichRaabe 它确实应该......另外,可能值得注意的是,它会给出与 xbb 的答案不同的结果,它将计算每个字符串的所有可能匹配,而不是在第一次匹配时停止......是我不确定的正确行为:)
【解决方案2】:

看起来您也需要部分匹配。下面的代码很直观,但可能效率不高。并且还假设你对 dict 结果没问题。

>>> data_items = ['abc','123data','dataxyz','456','344','666','777','888','888','abc','xyz'] >>> 搜索 = ['abc','123','xyz','456'] >>> 结果 = {k:0 for k in search} >>> 对于 data_items 中的项目: 对于搜索中的 search_item: 如果 search_item 在项目中: 结果[搜索项]+=1 >>> 结果 {'123':1,'abc':2,'xyz':2,'456':1}

【讨论】:

  • @FrerichRaabe 我还要补充一点,如果使用普通的dict 并且由于ints 是不可变的,那么result = dict.fromkeys(search, 0) 可以说更具可读性、效率和向后兼容...
【解决方案3】:
counts={}
for s in search:
    lower_s=s.lower()  
    counts[lower_s]=str(data_items.count(lower_s))

如果你对使用字典没问题(因为你说结构,这是一个更好的选择)。

【讨论】:

  • 谢谢,这似乎有效,但我需要将我的 data_items 转换为小写,以便匹配有效。在哪里,我会这样做吗?我尝试使用 .lower() 但不确定在哪里应用它
  • 此代码不会产生 OP 给出的预期结果,如果 search 仅包含 123,则 data_items 中的 123data 应该算作匹配。
  • 没错,我在 OP 中没有注意到这一点。
猜你喜欢
  • 2012-05-31
  • 2011-03-02
  • 1970-01-01
  • 2013-11-04
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多