我想做的是确定两个字符串的共同元素的分组程度。可能已经有数学函数,或者已经有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']
但是,我再次寻找这种算法是否已经具有名称和实现。
答案 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的答案。我对其做了一些修改:
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