Preciso dividir um número em 3 partes. A seguinte função ( source ) faz isso corretamente:
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)]
Então
assert parts(8, 3) == [3, 3, 2]
assert parts(9, 3) == [3, 3, 3]
assert parts(10, 3) == [4, 3, 3]
Dessa lista, preciso de uma lista de listas contendo um intervalo de 0 a num + 3
, de modo que cada sublista
- em um índice par tem comprimento de 1
- em um índice ímpar tem comprimento de
n
,n
de onde é obtidoparts
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]]
Isto é o que eu tentei:
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
No entanto, só funciona quando num
é divisível por div
. Como posso consertar isso?
Estas são as saídas da minha função:
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]]
Em vez de usar
base = i * (length + 1)
, comece combase = 0
(antes do loop) e apenas aumentebase
quantos elementos você adicionou nessa iteração.Parece que cada sublista contém números crescentes. Isto é o que
itertools.count
pode lhe dar.Adaptei sua função para usá-la assim: