Django FuzzyWuzzy:StringProcessor出错。请将\u非\u字母\u非\u数字\u替换为\u空格

Django FuzzyWuzzy:StringProcessor出错。请将\u非\u字母\u非\u数字\u替换为\u空格,django,python-3.x,fuzzy-logic,fuzzywuzzy,Django,Python 3.x,Fuzzy Logic,Fuzzywuzzy,我无法运行以下函数: match, match_score = process.extractOne(score, pct_dict.keys()) 我遇到一个空白错误,似乎无法解决。你知道这是什么原因吗 它应该做什么:如果分数是15,它应该返回0.026 错误: 错误:输出=self.func(*已解析参数,**已解析参数)wnas1 |文件“/code/cleveland/templatetags/percentiles_ratings.py”,第行 32,在get_百分位标准wnas1中

我无法运行以下函数:

match, match_score = process.extractOne(score, pct_dict.keys())
我遇到一个空白错误,似乎无法解决。你知道这是什么原因吗

它应该做什么:如果分数是15,它应该返回0.026

错误: 错误:输出=self.func(*已解析参数,**已解析参数)wnas1
|文件“/code/cleveland/templatetags/percentiles_ratings.py”,第行 32,在get_百分位标准wnas1中|匹配,匹配|分数= process.extractOne(score,pct_dict.keys())wnas1文件 “/usr/local/lib/python3.7/site packages/fuzzywuzzy/process.py”,第行 220,在extractOne wnas1中返回最大值(最佳列表,键=λ i:i[1])wnas1 |文件 “/usr/local/lib/python3.7/site packages/fuzzywuzzy/process.py”,第行 78,在ExtractWithout Order wnas1中|已处理|查询= 处理器(查询)wnas1 |文件 “/usr/local/lib/python3.7/site packages/fuzzywuzzy/utils.py”,第95行, 在全过程wnas1中,串出= StringProcessor。用空格替换非字母非数字 wnas1 |文件 “/usr/local/lib/python3.7/site packages/fuzzywuzzy/string_processing.py”, 第26行,用空格wnas1替换非字母和数字 |返回cls.regex.sub(“,一个字符串)

代码:
从未来导入unicode文本
从django导入模板
从fuzzyfuzzy导入fuzz
从模糊导入过程
register=template.Library()
@register.simple_标记
def get_perc(分数):
匹配_阈值=80
pct_dict={14:0.016,14.7:0.021,15.3:0.026,16:0.034,16.7:0.04,17.3:0.05,18:0.07,18.7:0.09,
19.3: 0.11, 20: 0.13, 20.7: 0.17, 21.3: 0.21, 22: 0.26, 22.7: 0.31, 23.3: 0.38, 24: 0.47}
如果不得分:
返回“-”
elif评分<26.7分:
根据文档返回',您需要比较两个字符串。这意味着您需要转换字符串中的值以进行比较。然后你需要这样做:

match, match_score = process.extractOne(str(score), pct_dict.keys())
value = min(pct_dict, key=lambda x:abs(x - score))
# then some logics to see if value is close to score or put some static threshold value like `abs(value-score) < .3`
我不推荐这种方法,因为这样做不准确

>>> x = ['1','2','3']
>>> y='2'
>>> process.extractOne(y,x)
('2', 100)
>>> y='2.2'
>>> process.extractOne(y,x)
('2', 90)
>>> y = '2.9'
>>> process.extractOne(y,x)
('2', 90)
在最后两个条目中,您将看到2.2和2.9的得分90,其中2.9更接近3

由于您有数字,我建议您只需将它们进行如下比较:

match, match_score = process.extractOne(str(score), pct_dict.keys())
value = min(pct_dict, key=lambda x:abs(x - score))
# then some logics to see if value is close to score or put some static threshold value like `abs(value-score) < .3`
value=min(pct_dict,key=lambda x:abs(x-分数))
#然后进行一些逻辑分析,看看值是否接近分数,或者设置一些静态阈值,如'abs(value score)<.3`

关于这一点,几乎没有什么可以帮助您的。

谢谢,这很有效。感谢您对字符串值的澄清。这允许我设置str(score)将score值转换为字符串

以下是运行代码:

@register.simple_tag
def get_perc(score):
    MATCH_THRESHOLD = 80
    pct_dict = {'14': '0.016', '14.7': '0.021', '15.3': '0.026', '16': '0.034', '16.7': '0.04', '17.3': '0.05', '18': '0.07', '18.7': '0.09', '19.3': '0.11', '20': '0.13', '20.7': '0.17', '21.3': '0.21', '22': '0.26', '22.7': '0.31', '23.3': '0.38', '24': '0.47'}
    if not score:
        return '--'
    elif score < 24:
        return '<1'

    match, match_score = process.extractOne(str(score), pct_dict.keys())

    if match_score >= MATCH_THRESHOLD:
        return pct_dict[match]
    else:
        return '--'
@register.simple\u标签
def get_perc(分数):
匹配_阈值=80
pct_dict={'14':'0.016','14.7':'0.021','15.3':'0.026','16':'0.034','16.7':'0.04','17.3':'0.05','18':'0.07','18.7':'0.09','19.3':'0.11','20':'0.13','20.7':'0.17','21.3':'0.21','22':'0.26','22.7':'0.31','23.3':'0.37''
如果不得分:
返回“-”
elif评分<24分:

return“非常感谢。这就是解决办法。我使用str()将数据转换为字符串和分数值。我将把我的答案放在下面。