无法遍历字典来比较2个字符串并返回Python中的最大比率

时间:2015-08-03 08:20:09

标签: python csv for-loop dictionary

我有一个存储在csv中的项目列表。我正在尝试将项目名称与csv列表进行比较,以查看是否存在匹配项。我将csv列表加载到字典然后将其传递给函数。将字典上的每个项目与输入项目进行比较,输入项目将给出匹配率。我想要退回比率最高的项目,最高比率也必须高于设定的最大比率。

项目csv文件的示例

001 green apple
002 red apple
003 orange
004 mango

这是我到目前为止所尝试的

def fuzzy_token_set_matching(index_dict, str_for_comparison):
    matching_threshold = 70 

    #If I try to get dict size here, it's 0
    print(len(index_dict))     

    for index, indexed_string in index_dict.items():       
        max_ratio = 0
        #Compare input name vs name in dictionary
        fuzz_matching_ratio = fuzz.token_sort_ratio(indexed string, str_for_comparison)        
        if fuzz_matching_ratio > max_ratio:
            max_ratio = fuzz_matching_ratio            

            if max_ratio > matching_threshold:
                return index, indexed_string                
            else:
                return None

input_file = 'index.csv'
output_file = 'results.csv'

#Load index list into a dictionary
with open(input_file, mode = 'r') as index_infile:
    index_reader = csv.reader(index_infile)
    index_dict = {rows[0]:rows[2] for rows in index_reader}

print(fuzzy_token_set_matching(index_dict, 'green apple'))

>>> Current results return: 0 
>>> Correct result: 001 green apple

出于某种原因,即使存在完全匹配且返回100,我的每个结果都会得到“无”。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,即使有更多项目需要考虑,您仍然会在第一次循环后返回。这是代码的相关部分:

for index, indexed_string in index_dict.items():
        #...
        if max_ratio > matching_threshold:
            return index_index, title                
        else:
            return None

您不希望每次都运行else子句,但前提是循环结束且没有符合阈值的匹配。请尝试改为:

for index, indexed_string in index_dict.items():
        #...
        if max_ratio > matching_threshold:
            return index_index, title
return None

你也可以让函数在没有明确return None行的情况下结束,因为这是默认行,但我建议保留return语句以明确说明这是故意的。

请注意,这将返回超过阈值的第一个匹配,但不一定是最佳匹配。如果您只想要最佳匹配,您可能希望保存最大索引,然后将if的两个部分移出循环:

for index, indexed_string in index_dict.items():
    #...       
    if fuzz_matching_ratio > max_ratio:
        max_ratio = fuzz_matching_ratio
        max_index = index
        max_string = indexed_string

if max_ratio > matching_threshold:
    return max_index, max_string          
else:
    return None