确定将两个列表的元素分组的程度

时间:2019-03-24 01:41:26

标签: python algorithm

我想做的是确定两个字符串的共同元素的分组程度。可能已经有数学函数,或者已经有scipy / numpy / etc函数来执行此操作。我只是不知道它叫什么。我已经用谷歌搜索了。例如:

该组将获得满分(所有相似的元素都被分组):

['a','a','a','b','b','b']

也会:

['b','b','b','a','a','a']

该系列的出租人得分:

['a','a','b','b','b','a']

该系列的得分非常低:

['a','b','a','b','a','b']

我可以想到几种实现此目的的方法,我只是想知道是否已经为此类事情定义了一个函数/算法。

我考虑过可能会根据字符串中离散值的计数生成一个完美分组的字符串,并计算实际字符串与完美字符串之间的Levenshtein距离。例如,比较:

['a','a','a','b','b','b']

收件人:

['b','b','b','a','a','a']

但是,我再次寻找这种算法是否已经具有名称和实现。

2 个答案:

答案 0 :(得分:3)

我无法想到任何现有的指标,但似乎很容易组成一个指标。您要问的是计算数组中的组数。

我的指标:数组的长度除以组数

定义:

def metric(lst):
    L = len(lst)
    n = len(list(itertools.groupby(lst, lambda x: x)))
    return L/float(n)   # you can omit float if python 3

groupby将计算数组lst中相同元素的块数。您不想像通常使用groupby那样对它进行排序,因为您正在计算lst元素中的更改。然后,我们将lst的长度除以块数,得出“平均块长”。这应该符合您的要求。

您可能需要衡量指标。在上述情况下,它将倾向于使用更少块的更长数组。例如,您可以考虑L的平方根,以使度量遵循收益递减定律

答案 1 :(得分:1)

我真的很喜欢adrtam's的答案。我对其做了一些修改:

  1. 提高了完整性并使其在运行时可以正常工作
  2. 使指标不受列表大小的影响
  3. 更改了度量标准,以使完美分组的列表的得分为1(最低得分)。
import itertools

def metric(lst):
    L = len(list(set(lst))) # Number of unique elements
    n = len(list(itertools.groupby(lst, lambda x: x))) # Number of groups
    return n / float(L)   # You can omit float if Python 3

# Test cases
list1 = ['a','a','a','b','b','b']
list2 = ['a','a','b','b','b','a']
list3 = ['b', 'b', 'a', 'a', 'b', 'a', 'a', 'b', 'a', 'b', 'a', 'a']

a = metric(list1)
b = metric(list2)
c = metric(list3)

print(a, b, c)
1.0 1.5 4.0