Python:双重条件下的字符串比较

问题描述 投票:-2回答:3

尝试搜索2个列表以查找常用字符串。第一个列表是一个带有文本的文件,而第二个列表是在实际单词之前具有对数概率的单词列表 - 要匹配,一个单词不仅需要在两个列表中,而且还具有一定的最小对数概率(例如,在-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到下面这个问题。

python string conditional logarithm
3个回答
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
投票

这是我的解决方案,不使用regex。首先创建一个在可接受范围内的单词字典,然后检查文本中的每个单词是否在dict中。

word_dict = {}

with open('probability.txt', 'r') as prob, open('text.txt', 'r') as textfile:
    for line in prob:
        if (-2.123456 < float(line.split()[0]) < 0):
            word_dict[line.split()[1]] = line.split()[0]

    for line in textfile:
        for word in line.split():
            if word in word_dict.keys():
                print('MATCH, {}: {}'.format(word, word_dict[word]))

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)
© www.soinside.com 2019 - 2024. All rights reserved.