python - 将一个K长度的列表拆分为尽可能 "even"的L个子列表,即使K/L留有余数

标签 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 中为任意长度的列表和任意数量的子列表找到一个解决方案,那对我来说就足够了。问题是在解决这样的问题时,我什至不知道从哪里开始。有谁知道我在找什么?

最佳答案

>>> 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']

关于python - 将一个K长度的列表拆分为尽可能 "even"的L个子列表,即使K/L留有余数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6854093/

相关文章:

python - 如何使用循环检查字符串中的所有字符是否大写

python - 如何在python中重新启动随机游走

python - 如何在Pygame中添加蛇体

python - 突然在运行测试时我得到 "TypeError: ' NoneType' object is not iterable

python 将列表写入文件

删除 R 中的空间异常值(纬度和经度坐标)

C# 组合两组不同的列表进行迭代

在两个集合之间映射元素的算法

ruby - 尝试创建一个对生成器

c++ - 帮助解决这个问题