<p>如果数字列表不是巨大的,我会首先计算一个数字和它的前例之间的每一个比率,然后选择最大的分割</p>
<p>例如:</p>
<pre><code>def split_numbers_list(numbers_list, n_groups):
# If the number of groups is 1 or less, the whole list the only group
if n_groups <= 1:
return [numbers_list]
n_splits = min(len(numbers_list), n_groups) # Can't have more groups than elements
# Now we calculate the ratios and store them in (index, ratio) tuples
ratios = [
(i, numbers_list[i + 1] / numbers_list[i]) for i in range(len(numbers_list) - 1)
]
sorted_ratios = sorted(ratios, key=lambda r: r[1], reverse=True)
# `chosen_splits` stores the boundaries of each group
chosen_splits = (
[0]
+ sorted([r[0] + 1 for r in sorted_ratios[: n_splits - 1]])
+ [len(numbers_list)]
)
return [
numbers_list[chosen_splits[i] : chosen_splits[i + 1]]
for i in range(len(chosen_splits) - 1)
]
</code></pre>
<p>但是请注意这对<code>numbers_list</code>的假设:它必须是一个<strong>排序的</strong>严格正的</strong>数字列表,否则这个函数将不起作用</p>
<p>一些例子:</p>
<pre><code>>>> my_list = [1, 2, 3, 4, 5, 100, 101, 103, 504, 2301]
>>> split_numbers_list(my_list, 5)
[[1], [2, 3, 4, 5], [100, 101, 103], [504], [2301]]
>>> split_numbers_list(my_list, 3)
[[1, 2, 3, 4, 5], [100, 101, 103], [504, 2301]]
</code></pre>