将K长度列表拆分为尽可能“均匀”的L子列表,即使K / L留下余数

时间:2011-07-28 04:29:04

标签: python list math division sublist

我不知道如何更好地说出我正在寻找的东西,所以请耐心等待。

假设我有一个包含17个元素的列表。为简洁起见,我们将此列表表示为ABCDEFGHIJKLMNOPQ。如果我想把它分成7个足够“均匀”的子列表,它可能看起来像这样:

ABC DE FGH IJ KL MNO PQ

这里,每个子列表的长度是 3,2,3,2,2,3,2 。最大长度仅比最小长度多一个:ABC DE FGH I JKL MN OPQ有七个子 - 列表,但这里的长度范围是两个。

此外,检查每对3的2对是多少:这遵循相同的RANGE≤1的规则。ABC DEF GH IJ中的长度范围KLM NO PQ也是1,但它们是不平衡的:3,3,2,2,3,2,2。理想情况下,如果要继续减少子以这种方式列出,这些数字永远不会相互偏离。

当然,有一种方法可以“均匀”将列表以这种方式划分为子列表。我不是在寻找一套详尽的解决方案 - 如果我能在Python中获得一个解决任何长度和任意数量的子列表的解决方案,这对我来说已经足够了。问题是我在解决这样的问题时甚至不知道从哪里开始。有谁知道我在找什么?

3 个答案:

答案 0 :(得分:3)

>>> s='ABCDEFGHIJKLMNOPQ'
>>> parts=7
>>> [s[i*len(s)//parts:(i+1)*len(s)//parts] for i in range(parts)]
['AB', 'CD', 'EFG', 'HI', 'JKL', 'MN', 'OPQ']


>>> import string
>>> for j in range(26):
...  print [string.uppercase[i*j//parts:(i+1)*j//parts] for i in range(parts)]
... 
['', '', '', '', '', '', '']
['', '', '', '', '', '', 'A']
['', '', '', 'A', '', '', 'B']
['', '', 'A', '', 'B', '', 'C']
['', 'A', '', 'B', '', 'C', 'D']
['', 'A', 'B', '', 'C', 'D', 'E']
['', 'A', 'B', 'C', 'D', 'E', 'F']
['A', 'B', 'C', 'D', 'E', 'F', 'G']
['A', 'B', 'C', 'D', 'E', 'F', 'GH']
['A', 'B', 'C', 'DE', 'F', 'G', 'HI']
['A', 'B', 'CD', 'E', 'FG', 'H', 'IJ']
['A', 'BC', 'D', 'EF', 'G', 'HI', 'JK']
['A', 'BC', 'DE', 'F', 'GH', 'IJ', 'KL']
['A', 'BC', 'DE', 'FG', 'HI', 'JK', 'LM']
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL', 'MN']
['AB', 'CD', 'EF', 'GH', 'IJ', 'KL', 'MNO']
['AB', 'CD', 'EF', 'GHI', 'JK', 'LM', 'NOP']
['AB', 'CD', 'EFG', 'HI', 'JKL', 'MN', 'OPQ']
['AB', 'CDE', 'FG', 'HIJ', 'KL', 'MNO', 'PQR']
['AB', 'CDE', 'FGH', 'IJ', 'KLM', 'NOP', 'QRS']
['AB', 'CDE', 'FGH', 'IJK', 'LMN', 'OPQ', 'RST']
['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU']
['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STUV']
['ABC', 'DEF', 'GHI', 'JKLM', 'NOP', 'QRS', 'TUVW']
['ABC', 'DEF', 'GHIJ', 'KLM', 'NOPQ', 'RST', 'UVWX']
['ABC', 'DEFG', 'HIJ', 'KLMN', 'OPQ', 'RSTU', 'VWXY']

答案 1 :(得分:1)

如果您有一个长度为N的列表,并且您想要一些子列表S,那么在我看来,您应该从剩余部分开始。对于N == 17和S == 7,你有17 // 7 == 2和17%7 == 3.所以你可以从7长度值2开始,但知道你需要增加3的长度值为1以处理余数。由于您的长度值列表长度为7,并且您有3个要递增的值,您可以计算X = 7/3并将其用作步幅:递增第0个项目,然后是int(X)项目,int(2) * X)项目,等等。

如果这对您不起作用,我建议您通过Skiena获得一本名为 The Algorithm Design Manual 的书,并查看集合和树算法。

http://www.algorist.com/

答案 2 :(得分:0)

请参阅http://docs.python.org/library/itertools.html

上的“石斑鱼”示例