我有一些字符串列表,例如:
["foo bar SOME baz TEXT bob",
"SOME foo bar baz bob TEXT",
"SOME foo TEXT",
"foo bar SOME TEXT baz",
"SOME TEXT"]
Run Code Online (Sandbox Code Playgroud)
我希望它按精确度排序到SOME TEXT子串(大写无关紧要).像这样的顺序:
["SOME TEXT",
"foo bar SOME TEXT baz",
"SOME foo TEXT",
"foo bar SOME baz TEXT bob",
"SOME foo bar baz bob TEXT"]
Run Code Online (Sandbox Code Playgroud)
这个想法是 - 最好的分数得到与子串字位置最匹配的字符串.对于子串的单词之间更大量的"草率"单词 - 它得到的排序越低.
我找到了一些像fuzzyset或Levenshtein距离的库,但我不确定这是我需要的.根据我的理解,我知道我要排序的确切子字符串和那些libs搜索相似的单词.
实际上我需要在我的Django项目中进行一些数据库查询(Postgresql)之后进行此类操作.我已经尝试使用其ORM进行全文搜索,但没有得到相关的排序顺序(它不计算子字符串单词之间的距离).接下来我尝试过Haystack + Whoosh,但此刻也没有找到信息如何在那里做到这一点.所以现在的想法是获取查询集,然后将其排序出数据库(是的,我知道这可能是一个糟糕的决定,但是现在我希望它只是工作).但是,如果有人告诉我如何在任何技术中做到这一点,我在这里提到 - 这也将是非常酷.谢谢!
ps子串的长度应该是最多20个字符串中的2-10个字.
你可以使用difflib.SequenceMatcher,实现与您想要的输出非常相似的东西:
>>> import difflib
>>> l = ["foo bar SOME baz TEXT bob", "SOME foo bar baz bob TEXT", "SOME foo TEXT", "foo bar SOME TEXT baz", "SOME TEXT"]
>>> sorted(l, key=lambda z: difflib.SequenceMatcher(None, z, "SOME TEXT").ratio(), reverse=True)
['SOME TEXT', 'SOME foo TEXT', 'foo bar SOME TEXT baz', 'foo bar SOME baz TEXT bob', 'SOME foo bar baz bob TEXT']
Run Code Online (Sandbox Code Playgroud)
如果你不能说唯一的区别是两个元素的位置"foo bar SOME TEXT baz"和"SOME foo TEXT"你想要的输出相比是交换的.
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |