我不知道如何更好地说出我正在寻找的东西,所以请耐心等待。
假设我有一个包含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中获得一个解决任何长度和任意数量的子列表的解决方案,这对我来说已经足够了。问题是我在解决这样的问题时甚至不知道从哪里开始。有谁知道我在找什么?
答案 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 的书,并查看集合和树算法。
答案 2 :(得分:0)