Python 如何将列表划分为相似的平均子集

Python 如何将列表划分为相似的平均子集,python,algorithm,Python,Algorithm,在300个项目的列表中,我需要定位50个项目,全部重复6次(总共300次),这样每个项目都在一定范围内,并且项目在列表中的平均位置大约在中间(150) 对于特定范围内的每个项目,我指的是8个较小的子集,其位置如下: 1-36, 37-73, 74-110, 111-148, 149-186, 187-225, 226-262, 263-300. 例如,项目1在列表中可能有位置1、38、158、198、238、271,平均位置为150.6 我试图这样做,以自动化目前手动和耗时的过程,但我有困难找出

在300个项目的列表中,我需要定位50个项目,全部重复6次(总共300次),这样每个项目都在一定范围内,并且项目在列表中的平均位置大约在中间(150)

对于特定范围内的每个项目,我指的是8个较小的子集,其位置如下: 1-36, 37-73, 74-110, 111-148, 149-186, 187-225, 226-262, 263-300. 例如,项目1在列表中可能有位置1、38、158、198、238、271,平均位置为150.6

我试图这样做,以自动化目前手动和耗时的过程,但我有困难找出算法。我目前的想法是,对于每个项目,将项目随机放置在每个分段中,确保如果我为每个后续分段选择最小位置,平均值不能高于150(+-2),如果是,则再次随机放置前一个位置,直到一个数字起作用。但仔细想想,它可能不起作用,也可能不会很快。我真的非常感谢你在这方面的帮助

(如果重要的话,用Python编码)

编辑:


为了澄清,我尝试随机定位这些项目,因此,例如,项目1不会在所有子集中出现在第一位(我知道这不会使平均值为150,只是为了澄清)。在我提供的示例中,项目1将首先出现在第一个子集中,其次出现在第二个子集中,第九个出现在第三个子集中。这实际上是我遇到麻烦的地方

通过构造,这很简单。让我们参考四对中的8个切片(子集)。请注意,我已经更正了切片边界上的算法

A    1-38 , 264-300    37 slots    first & last
B   39-75 , 226-263    38 slots
C   76-113, 188-225    38 slots
D  113-150, 151-187    37 slots    middle pair
更具体地说,我们将在那里反向配对,映射位置1-300、2-299、3-298等。这些元素对将从50个项目的列表中接收相同的值

现在,我们需要3对6片,均匀分布。这些集合中的每一个都将省略上面的一对:

A B C     items  1-12
A B D     items 13-24
A C D     items 25-36
B C D     items 37-48
由于我们严格成对分配这些对象,现在48个对象的平均值正好为150.5,这是最佳解决方案。如果物品的数量可以被4整除,我们就可以轻而易举地完成分配。然而

我们现在还有49和50项,12项。切片A和D有2对开口;B&C有4对开着的。我们将这些分配给ABC和BCD组,完成施工

每个项目分配到6个不同的切片,平均位置为150.5,整个集合的平均值为300


对OP评论的回应

我从来没有说过它们是按项目编号的顺序排列的。继续这样做,但只针对下半部分切片(1-150)


现在,
shuffle
每个分区。最后,使上半部分成为下半部分的镜像。问题解决了——也许,取决于你对“随机”的定义。前半部分的熵很高,但考虑到前半部分,后半部分是完全确定的。

这里的“好”输出是什么?您可以在一个过程中试探性地完成它,但是您可以通过多次迭代来改进它(这不是一个简单的任务)。我认为这太宽泛了对不起,一个好的输出应该是一个包含300个项目的列表,其中每个项目(例如,项目1、项目2、项目3)在列表中重复6次,并且在列表中的平均位置大约为150。这比前面的描述要好得多;谢谢你需要一个随机过程,还是一个确定性过程合适呢?两者都可以,因为我可以在算法运行之前对列表进行随机洗牌,但我有兴趣学习如何使用随机过程,谢谢!非常感谢您的快速回答!然而,我正试图让定位更随机一些。如果第1项被放在A中,它将是第一个为这两个部分显示的,虽然这是可以每隔一段时间显示一次,如果所有项目的位置对于每个项目都是一致的,那么我尝试做的实验就有点无效了。[我将更新我的问题以反映这一点]。在我使用的示例中,位置更随机