从目标字符串中的列表中查找字符串出现次数的最佳方法是什么?具体来说,我有一个清单:
string_list = [
"foo",
"bar",
"baz"
]
target_string = "foo bar baz bar"
# Trying to write this function!
count = occurrence_counter(target_string) # should return 4
我希望优化以最大限度地降低速度和内存使用量,如果这有所不同的话。就大小而言,我希望string_list
最终可能包含数百个子串。
答案 0 :(得分:4)
使用collelctions.Counter的另一种方式:
from collections import Counter
word_counts = Counter(target_string.split(' '))
total = sum(word_counts.get(w, 0)) for w in string_list)
答案 1 :(得分:3)
这有效!
def occurrence_counter(target_string):
return sum(map(lambda x: x in string_list, target_string.split(' ')))
字符串被分割成标记,然后每个标记在列表中变换为1,否则变为0。 sum函数最后将这些值相加。
编辑:还:
def occurrence_counter(target_string):
return len(list(filter(lambda x: x in string_list, target_string.split(' '))))
答案 2 :(得分:2)
这个Python3应该可以工作:
In [4]: string_list = [
...: "foo",
...: "bar",
...: "baz"
...: ]
...:
...: set_of_counted_word = set(string_list)
...:
...: def occurrence_counter(target_str, words_to_count=set_of_counted_word):
...: return sum(1 for word in target_str.strip().split()
...: if word in words_to_count)
...:
...:
...: for target_string in ("foo bar baz bar", " bip foo bap foo dib baz "):
...: print("Input: %r -> Count: %i" % (target_string, occurrence_counter(target_string)))
...:
...:
Input: 'foo bar baz bar' -> Count: 4
Input: ' bip foo bap foo dib baz ' -> Count: 3
In [5]:
答案 3 :(得分:1)
您可以使用变量来存储运行计数,如下所示迭代列表:
def occurence_counter(x):
count = 0
for y in x:
count +=1
return count
答案 4 :(得分:1)
另一种解决方案:
def occurrence_counter(target_string, string_list):
target_list = target_string.split(' ')
return len([w for w in target_list if w in string_list])
答案 5 :(得分:1)
sum
和string.count
的组合:
def counter(s, lst)
return sum(s.count(sub) for sub in lst)
这不会计算相同模式的重叠次数。
答案 6 :(得分:1)
您可以使用Trie将子字符串转换为正则表达式模式(例如(?:ba[rz]|foo)
)并解析target_string
:
import re
from trie import Trie
trie = Trie()
substrings = [
"foo",
"bar",
"baz"
]
for substring in substrings:
trie.add(substring)
print(trie.pattern())
# (?:ba[rz]|foo)
target_string = "foo bar baz bar"
print(len(re.findall(trie.pattern(), target_string)))
# 4
所需的库位于:trie.py
它应该比为每个target_string
解析整个substring
快得多,但它可能不会返回重叠子串的所需结果。它会为2
和["foo", "bar", "foobar"]
返回"foobar"
。
相关问题是:“Speed up millions of regex replacements in Python 3”:此处为answer with sets和one with a trie regex。
答案 7 :(得分:0)
我不确定这是最pythonic的方式,但你可以尝试一下:
text