【问题标题】:Is there an algorithm/way to find out how different (or the minimum distance between) 2 list orders?是否有一种算法/方法可以找出 2 个列表订单之间的差异(或最小距离)?
【发布时间】:2023-02-12 16:57:35
【问题描述】:

我有一堆要按特定顺序评价的项目。例如:

["Person1", "Person2", "Person3", "Person4", "Person5"]

可以这样订购:

["Person4", "Person5", "Person3", "Person1", "Person2"]

给定同一个列表的 2 个不同顺序,有没有办法量化它们之间的差异? 我知道字符串存在 Levenshtein 距离,我正在寻找类似的东西。

我对距离的理想测量是将一个列表更改为另一个列表所需的两个相邻项目之间的最小切换次数——但如果您认为其他算法更好,我愿意接受其他算法。

我正在寻找的答案是一种算法(最好是 [Python] 实现)来执行这种测量(快速)。

提前致谢!

【问题讨论】:

    标签: list sorting distance levenshtein-distance


    【解决方案1】:

    如您已经指出的,要量化两个字符串的“不同”程度,您可以使用Levenshtein distance,即implemented in this library

    pip install levenshtein
    
    >>> import Levenshtein
    >>> Levenshtein.distance("lewenstein", "levenshtein")
    2
    

    要确定两个列表的“不同”程度,您可以将列表中的每个值分配给一个 Unicode 字符。

    import Levenshtein
    
    def list_distance(A, B):
        # Assign each unique value of the list to a unicode character
        unique_map = {v:chr(k) for (k,v) in enumerate(set(A+B))}
        
        # Create string versions of the lists
        a = ''.join(list(map(unique_map.get, A)))
        b = ''.join(list(map(unique_map.get, B)))
    
        return Levenshtein.distance(a, b)
    
    A = ["Person1", "Person2", "Person3", "Person4", "Person5"]
    B = ["Person4", "Person5", "Person3", "Person1", "Person2"]
    list_distance(A,B)
    

    返回 4。

    这通过对任意 Unicode 字符进行唯一映射来实现,例如:

    • 列表A到字符串'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2014-12-13
    相关资源
    最近更新 更多