簡體   English   中英

Pythonic計算字符串列表中出現次數的方法

[英]Pythonic way to count occurrences from a list in a string

從目標字符串中的列表中查找字符串出現次數的最佳方法是什么? 具體來說,我有一個清單:

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最終可能包含數百個子串。

使用collelctions.Counter的另一種方法:

from collections import Counter
word_counts = Counter(target_string.split(' '))
total = sum(word_counts.get(w, 0)) for w in string_list)

這有效!

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(' '))))

這個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]:

您可以使用變量來存儲運行計數,如下所示迭代列表:

def occurence_counter(x):
    count = 0
    for y in x:
        count +=1
    return count

另一種方案:

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])

sumstring.count組合:

def counter(s, lst)
    return sum(s.count(sub) for sub in lst)

這不會計算相同模式的重疊出現次數。

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

它應該比為每個substring解析整個target_string快得多,但它可能不會為重疊的子字符串返回所需的結果。 它為["foo", "bar", "foobar"]"foobar"返回2

一個相關的問題是:“ 在Python 3中加速數百萬的正則表達式替換 ”:這是一個集合答案一個帶有trie正則表達式答案

我不確定這是最pythonic的方式,但你可以試試:

string_list_B = target_string.split(" ")
commonalities = set(string_list) - (set(string_list) - set(string_list_B))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM