我需要将一个数字分成三部分。以下函数(source)可以正确执行此操作:
def parts(num: int, div: int) -> list[int]:
"""Split a number into equal parts."""
return [num // div + (1 if x < num % div else 0) for x in range(div)]
所以
assert parts(8, 3) == [3, 3, 2]
assert parts(9, 3) == [3, 3, 3]
assert parts(10, 3) == [4, 3, 3]
从该列表中,我需要一个包含范围从 0 到 的列表列表num + 3
,这样每个子列表
- 偶数索引处的长度为 1
- 奇数索引处的长度为
n
,n
从哪里获取parts
assert expected(8, 3) == [[0], [1, 2, 3], [4], [5, 6, 7], [8], [9, 10]]
assert expected(9, 3) == [[0], [1, 2, 3], [4], [5, 6, 7], [8], [9, 10, 11]]
assert expected(10, 3) == [[0], [1, 2, 3, 4], [5], [6, 7, 8], [9], [10, 11, 12]]
这是我尝试过的:
def actual(num: int, div: int) -> list[list[int]]:
matrix: list[list[int]] = []
for i, length in enumerate(parts(num, div)):
base = i * (length + 1)
matrix.append([base])
matrix.append([base + j + 1 for j in range(length)])
return matrix
然而,它仅在num
被 整除时才有效div
。我该如何修复它?
这些是我的函数的输出:
assert actual(8, 3) == [[0], [1, 2, 3], [4], [5, 6, 7], [6], [7, 8]]
assert actual(9, 3) == [[0], [1, 2, 3], [4], [5, 6, 7], [8], [9, 10, 11]]
assert actual(10, 3) == [[0], [1, 2, 3, 4], [4], [5, 6, 7], [8], [9, 10, 11]]
不要使用 ,而是从(循环之前)
base = i * (length + 1)
开始,然后递增您在该迭代中添加的元素数量。base = 0
base
看起来每个子列表都包含递增的数字。这就是
itertools.count
能给你的。我已经调整了您的功能以像这样使用它: