Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用map()获取列表元素在字符串中存在的次数_Python_Regex_Mapreduce - Fatal编程技术网

在Python中使用map()获取列表元素在字符串中存在的次数

在Python中使用map()获取列表元素在字符串中存在的次数,python,regex,mapreduce,Python,Regex,Mapreduce,我正在尝试获取列表中的每个项目在Python中以字符串形式出现的次数: paragraph = "I eat bananas and a banana" def tester(x): return len(re.findall(x,paragraph)) map(tester, ['banana', 'loganberry', 'passion fruit']) 返回[2,0,0] 但是,我想做的是扩展它,以便将段落值输入map()函数。现在,tester()函数已经硬编码了段落。有人有办

我正在尝试获取列表中的每个项目在Python中以字符串形式出现的次数:

paragraph = "I eat bananas and a banana"

def tester(x): return len(re.findall(x,paragraph))

map(tester, ['banana', 'loganberry', 'passion fruit'])
返回[2,0,0]

但是,我想做的是扩展它,以便将段落值输入map()函数。现在,tester()函数已经硬编码了段落。有人有办法做到这一点吗(也许可以制作一个n长度的段落值列表)?还有其他想法吗

请记住,每个数组值在将来的某个时刻都有权重,因此需要将这些值保存在一个列表中,而不是将它们一起处理


更新:段落通常为20K,列表通常有200多个成员。我的想法是map是并行运行的,因此它比任何串行方法都要有效得多。

闭包将是一个快速的解决方案:

paragraph = "I eat bananas and a banana"

def tester(s): 
    def f(x):
        return len(re.findall(x,s))
    return f

print map(tester(paragraph), ['banana', 'loganberry', 'passion fruit'])

关闭将是一个快速解决方案:

paragraph = "I eat bananas and a banana"

def tester(s): 
    def f(x):
        return len(re.findall(x,s))
    return f

print map(tester(paragraph), ['banana', 'loganberry', 'passion fruit'])

我知道你没有要求理解列表,但不管怎样,这里是:

paragraph = "I eat bananas and a banana"
words = ['banana', 'loganberry', 'passion fruit']
[len(re.findall(word, paragraph)) for word in words]
这是回报 [2, 0, 0]
还有。

我知道你没有要求理解列表,但不管怎样,它在这里:

paragraph = "I eat bananas and a banana"
words = ['banana', 'loganberry', 'passion fruit']
[len(re.findall(word, paragraph)) for word in words]
这是回报 [2, 0, 0] 还有

不知道为什么要在这里使用map()

不知道为什么要在这里使用map()。

这是我的版本

paragraph = "I eat bananas and a banana"

def tester(paragraph, x): return len(re.findall(x,paragraph))

print lambda paragraph: map(
    lambda x: tester(paragraph, x) , ['banana', 'loganberry', 'passion fruit']
        )(paragraph)
这是我的版本

paragraph = "I eat bananas and a banana"

def tester(paragraph, x): return len(re.findall(x,paragraph))

print lambda paragraph: map(
    lambda x: tester(paragraph, x) , ['banana', 'loganberry', 'passion fruit']
        )(paragraph)

这基本上只是为了避免列表理解,但是如果您喜欢函数式编程,那么您会喜欢


这基本上只是为了避免列表理解,但是如果您喜欢函数式编程,那么您会喜欢


对于大小为T字节的大文本上的平均长度为L字节的Q查询词,您需要一些不是O(QLT)的内容。您需要一种DFA风格的方法,它可以为您提供O(T)。。。安装后的成本。如果查询集相当静态,则可以忽略设置成本

例如,
http://en.wikipedia.org/wiki/Aho-Corasick_algorithm

它指向Python的C扩展:

http://hkn.eecs.berkeley.edu/~dyoo/python/ahocarasick/

对于大小为T字节的大型文本上的平均长度为L字节的Q查询词,您需要的不是O(QLT)的东西。您需要一种DFA风格的方法,它可以为您提供O(T)。。。安装后的成本。如果查询集相当静态,则可以忽略设置成本

例如,
http://en.wikipedia.org/wiki/Aho-Corasick_algorithm

它指向Python的C扩展:

http://hkn.eecs.berkeley.edu/~dyoo/python/ahocarasick/
下面是对goalposts移动的响应(“我可能需要正则表达式,因为我在不久的将来需要单词分隔符”):

此方法对文本进行一次解析,以获得所有“单词”的列表。每个词都会在目标词词典中查找,如果是目标词,则会对其进行计数。所用时间为O(P)+O(T),其中P是段落的大小,T是目标单词的数量。迄今为止,除my Aho Corasick解决方案外的所有其他解决方案(包括当前接受的解决方案)均为O(PT)

finditer版本是一个稻草人——它比findall版本慢得多

以下是目前公认的解决方案,以标准化形式表示,并添加了单词分隔符:

def currently_accepted_solution_augmented(targets, paragraph):
    def tester(s): 
        def f(x):
            return len(re.findall(r"\b" + x + r"\b", s))
        return f
    return map(tester(paragraph), targets)
在关闭时超出范围,可减少为:

# acknowledgement:
# this is structurally the same as one of hughdbrown's benchmark functions
def currently_accepted_solution_augmented_without_extra_closure(targets, paragraph):
    def tester(x):
        return len(re.findall(r"\b" + x + r"\b", paragraph))
    return map(tester, targets)

当前接受的解决方案的所有变化均为O(PT)。与当前接受的解决方案不同,带有单词分隔符的正则表达式搜索并不等同于简单的
段落.find(target)
。因为在这种情况下,重新引擎不使用“快速搜索”,添加单词分隔符会将其从慢速更改为非常慢速。

以下是对目标栏移动的响应(“我可能需要正则表达式,因为我在不久的将来需要单词分隔符”):

此方法对文本进行一次解析,以获得所有“单词”的列表。每个词都会在目标词词典中查找,如果是目标词,则会对其进行计数。所用时间为O(P)+O(T),其中P是段落的大小,T是目标单词的数量。迄今为止,除my Aho Corasick解决方案外的所有其他解决方案(包括当前接受的解决方案)均为O(PT)

finditer版本是一个稻草人——它比findall版本慢得多

以下是目前公认的解决方案,以标准化形式表示,并添加了单词分隔符:

def currently_accepted_solution_augmented(targets, paragraph):
    def tester(s): 
        def f(x):
            return len(re.findall(r"\b" + x + r"\b", s))
        return f
    return map(tester(paragraph), targets)
在关闭时超出范围,可减少为:

# acknowledgement:
# this is structurally the same as one of hughdbrown's benchmark functions
def currently_accepted_solution_augmented_without_extra_closure(targets, paragraph):
    def tester(x):
        return len(re.findall(r"\b" + x + r"\b", paragraph))
    return map(tester, targets)

当前接受的解决方案的所有变化均为O(PT)。与当前接受的解决方案不同,带有单词分隔符的正则表达式搜索并不等同于简单的
段落.find(target)
。因为在这种情况下,重新搜索引擎不使用“快速搜索”,添加单词分隔符会将其从慢速更改为非常慢速。

对此表示赞许。如果事情发生微妙的变化,它还允许增加功能。当然,如果他做的远不止这些,他可能应该重新思考,这样他就不会像我一样做一碗意大利面:)这很有效(和其他的一样),但我很确定这对于更大的场景和段落来说是最有效的。而且,正如mettadore所说,可以合理地扩展.Update-这种方法非常快:在上一代mac mini上,使用Python 2.5.4,段落102k字符和600个列表成员使用230ms。现在用
len(re.findall(x,s))
替换为
s.count(x)
可以-虽然我可能需要正则表达式,因为我在不久的将来需要单词分隔符。欢迎使用。如果事情发生微妙的变化,它还允许增加功能。当然,如果他做的远不止这些,他可能应该重新思考,这样他就不会像我一样做一碗意大利面:)这很有效(和其他的一样),但我很确定这对于更大的场景和段落来说是最有效的。而且,正如梅塔多尔所说,可以合理地扩展.Update——这种方法非常快:pa为230ms