<p>使用Lior的<code>rank</code>函数,可以使用<a href="https://docs.python.org/3/library/difflib.html" rel="nofollow noreferrer">difflib</a>实现示例输出:</p>
<pre><code>list1 = ["1 apple","2banana","mango"]
list2 = ["3bana2na 2+", "0.5 mango 1-", "apple2", "apple"]
import difflib
def rank(x):
dist = [len(list(difflib.ndiff(x, s))) for s in list2]
return dist.index(min(dist))
>>> sorted(list1, key=rank)
['1 apple', '2banana', 'mango']
</code></pre>
<p>或者用你的第一个例子:</p>
<pre><code>list1 = ["1 apple","2banana","mango"]
list2 = ["3bana2na 2+", "0.5 mango 1-", "apple2"]
>>> sorted(list1, key=rank)
['2banana', '1 apple', 'mango']
</code></pre>
<hr/>
<p>对参考列表使用一种形式的模糊匹配可能会更快。您可以使用difflib中的<a href="https://pypi.org/project/regex/" rel="nofollow noreferrer">regex module</a>或<a href="https://docs.python.org/3/library/difflib.html#difflib.get_close_matches" rel="nofollow noreferrer">get_close_matches</a>:</p>
<pre><code>list1 = ["1 apple","2banana","mango"]
list2 = ["3bana2na 2+", "0.5 mango 1-", "apple2"]
import difflib
def rank2(s, ref=list2):
try:
w=difflib.get_close_matches(s, ref)
return ref.index(w[0])
except IndexError:
return len(ref)+1
>>> sorted(list1, key=rank2)
['2banana', '1 apple', 'mango']
</code></pre>