1

我不知道更好的方式来表达我正在寻找的内容,所以请多多包涵。

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

ABC DE FGH IJ KL MNO PQ

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

此外,检查有多少个 2 分隔每对 3:这遵循相同的规则 RANGE ≤ 1。长度范围 inABC DEF GH IJ KLM NO PQ也是 1,但它们是不平衡的:3、3、2、2、3、2、2 . 理想情况下,如果以这种方式不断减少子列表,数字之间的偏差永远不会超过一个。

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

4

3 回答 3

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']
于 2011-07-28T05:13:57.313 回答
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的名为《算法设计手册》的书,并查看集合和树算法。

http://www.algorist.com/

于 2011-07-28T04:54:29.363 回答
0

请参阅http://docs.python.org/library/itertools.html上的“grouper”示例

于 2011-07-28T05:07:39.267 回答