尝试搜索2个列表以查找常用字符串。 1 -st 列表是一个带文本的文件,而2 -nd 是一个在实际单词之前具有对数概率的单词列表 - 要匹配,一个单词不仅需要在两个列表中,但也有一定的最小日志概率(例如,在-2,123456和0,000000之间;这是负2 增加到0)。制表符分隔列表如下所示:
-0.962890 dog
-1.152454 lol
-2.050454 cat
我遇到了这样的事情:
common = []
for i in list1:
if i in list2 and re.search("\-[0-1]\.[\d]+", list2):
common.append(i)
简单地预处理列表以删除某个阈值下的行的想法当然是有效的,但由于这个词及其概率都在同一行上,所以这也不是一个条件吗? (Regexps不是必需的,但是对于比较解决方案,无论是否有它们都会很有趣。)
编辑:own answer以下问题。
答案 0 :(得分:1)
假设您的列表包含"-0.744342 dog"
等字符串,而my_word_list
是字符串列表,那么:
worddict = dict(map(lambda x: (x, True), my_word_list))
import re
for item in my_list:
parts = re.split("\s+", item)
if len(parts) != 2:
raise ValueError("Wrong data format")
logvalue, word = float(parts[0]), parts[1]
if logvalue > TRESHHOLD and word in worddict:
print("Hurrah, a match!")
请注意第一行,它会从您的单词列表中生成一个字典。如果你不这样做,你将浪费大量时间通过单词列表进行线性搜索,导致你的算法的时间复杂度为O(n * m),而我提出的解决方案更接近O (n + m),n是my_list
中的行数,m是my_word_list
中的单词数。
答案 1 :(得分:1)
这是我未使用Fragment
的解决方案。首先创建一个在可接受范围内的单词字典,然后检查文本中的每个单词是否都在dict中。
regex
答案 2 :(得分:0)
经过数小时的反复试验后回答我自己的问题,并从这里和那里阅读提示。事实证明,我从一开始就在思考正确的方向,但需要将单词检测和模式匹配分开,而是将后者与日志概率检查结合起来。因此,创建具有所需日志概率的临时项目列表,然后将其与文本文件进行比较。
common = []
prob = []
loga , rithmus = -9.87 , -0.01
for i in re.findall("\-\d\.\d+", list2):
if (loga < float(i.split()[0]) < rithmus):
prob.append(i)
prob = "\n".join(prob)
for i in list1:
if i in prob:
common.append(i)