<p>根据您更新的评论,听起来您正在寻找K-Means算法,或类似的东西,它将根据列表元素与建议的中心的距离将列表元素分为不同的组(这是您的差异计算真正衡量的)。在</p>
<p>在您的标准中,请注意,从自身减去每个子组的最大值是没有意义的,因为根据定义,这个值总是零。所以,实际上,你看到的是max减去每个元素的和,超过所有非max元素(如何处理重复项也是一个需要回答的问题)。K-Means会做一些不同的事情(它会观察每个点与平均点的距离),但在精神上它是一样的。你可以修改k-means来使用你的组分数的概念,尽管在聚类输出方面我并没有看到任何好处,我需要看到一些关于不同标准的限制行为的数学证明,以确信它是重要的。在</p>
<p>使用<code>sklearn</code>和<code>numpy</code>模块可以很容易地实现这一点:</p>
<pre><code>from sklearn import cluster as cluster
import numpy as np
km = cluster.KMeans(n_clusters=4)
example_data = np.asarray([1,2,3, 11,12, 20,21,22, 30,35])[:,None]
km.fit(example_data)
</code></pre>
<p>然后看看<code>km.labels_</code>:</p>
^{pr2}$
<p>您可以看到这将组合在一起<code>[1,2,3]</code>,<code>[11, 12]</code>,<code>[20, 21 , 22]</code>,<code>[30, 35]</code>。下面是一些代码,可以为您实际获取这些信息:</p>
<pre><code>In [74]: example_data.tolist()[0]
Out[74]: [1, 2, 3, 11, 12, 20, 21, 22, 30, 35]
In [75]: [[x for i,x in enumerate(example_data.tolist()[0]) if km.labels_[i] == j]
for j in range(km.n_clusters)]
Out[75]: [[1, 2, 3], [20, 21, 22], [30, 35], [11, 12]]
</code></pre>
<p>但请注意,这并不是完美的:它是一种迭代方法,不能保证收敛到任何“真”解,对于足够奇怪的输入数据,您可以得到奇怪的输出。在</p>
<p>或者,对所需内容的更基本的理解是选择索引整数<code>i[0]</code>到{<cd9>},这样</p>
<pre><code>sub_lists[j] = original_list[i[j]:i[j+1]]
</code></pre>
<p>当<code>i[0]=0</code>和<code>i[k+1]</code>理解为“列表中的所有其他内容”时,定义:</p>
<pre><code>sub_lens = [len(s) for s in sub_lists]
max_len = max(sub_lens)
criterion(k, i[0], ..., i[k]) = max(max_len - s_len for s_len in sub_lens)
</code></pre>
<p>因此,一个解决方案是一个参数元组<code>(k, i[0], ..., i[k])</code>,并且您希望选择最小化上述表达式<code>criterion</code>。在</p>
<p>这个问题的一般解决方案相当复杂。但是如果您愿意接受一个贪婪的解决方案,除了最后的子列表之外,它将非常平衡,许多{a1}都可以。在</p>