python - 匹配两个几乎相同的列表的元素

标签 python difflib

假设我有两个字符串列表。我想通过获取与第一个列表的相应元素最相似的元素来重新排序第二个列表。

我已经这样做了:

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/

相关文章:

javascript - 在浏览器中为 diff2html 创建统一的差异文本

python - 按单词匹配更改,而不是按字符

python - 更好的模糊匹配性能?

python - 如何强制 pandas .loc 返回系列

python - 为什么无法在 pygame 中输入任何内容?

python - 使用 Python 和 ftplib 检查 FTP 服务器上的对象是文件还是目录

python - 在 python 中使用 difflib.diff_bytes 比较两个文件

python - AttributeError: 'pygame.math.Vector2' 对象没有属性

python - 恢复模型需要很长时间

python - 使用 difflib.get_close_matches() 忽略大小写