在Python中使用map()获取列表元素在字符串中存在的次数
我正在尝试获取列表中的每个项目在Python中以字符串形式出现的次数:在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()函数已经硬编码了段落。有人有办
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