假设我有两个字符串列表。我想通过获取与第一个列表的相应元素最相似的元素来重新排序第二个列表。
我已经这样做了:
import difflib
list1 = ['aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff', 'gggg', 'hhhh', 'iiii', 'jjjj']
list2 = ['eeez', 'fffz', 'dddz', 'cccz', 'iiiz', 'jjjz', 'aaaz', 'gggz', 'hhhz', 'bbbz']
len = len(list1)
i = 0
while i < len:
j = 0
while j < len:
if difflib.SequenceMatcher(None, list1[i], list2[j]).ratio() > 0.5:
eltMove = list2.pop(j)
list2.insert(i, eltMove)
break
j += 1
i += 1
print(list2)
输出:
['aaaz', 'bbbz', 'cccz', 'dddz', 'eeez', 'fffz', 'gggz', 'hhhz', 'iiiz', 'jjjz']
但在某些情况下它不起作用,因为 list2 中有一个元素与 list1 中的元素有点匹配,这会打破循环并跳过下一个元素,即使它们可以更好地匹配也是如此。
最佳答案
while i < len:
j = 0
new_l = []
while j < len:
new_l.append(difflib.SequenceMatcher(None, list1[i], list2[j]).ratio())
j += 1
ind = new_l.index(max(new_l))
eltMove = list2.pop(ind)
list2.insert(i, eltMove)
i += 1
它存储比率然后计算最大值,找出最大值的索引然后弹出/插入。
希望这是你需要的
for i, a in enumerate(list1):
new_l = [difflib.SequenceMatcher(None, a, b).ratio() for b in list2]
ind = new_l.index(max(new_l))
eltMove = list2.pop(ind)
list2.insert(i, eltMove)
缩短代码
考虑到@Jose Raul Barreras 的回复,对上述内容的适当修改为:
tmp = []
for i, a in enumerate(list1):
new_l = [difflib.SequenceMatcher(None, a, b).ratio() for b in list2]
ind = new_l.index(max(new_l))
eltMove = list2.pop(ind)
tmp.append(eltMove)
>>> tmp
['aaaz', 'bbbz', 'cccz', 'dddz', 'eeez', 'fffz', 'gggz', 'hhhz', 'iiiz', 'jjjz',
'aaaz', 'bbbz', 'cccz', 'dddz', 'eeez', 'fffz', 'gggz', 'hhhz', 'iiiz', 'jjjz']
关于python - 匹配两个几乎相同的列表的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38777857/