Как разделить список на определенное количество списков - PullRequest
1 голос
/ 17 февраля 2020
with open(path) as file:
    h=file.read().split('\n')
links = list(filter(None, h)) #147 length
chunks = [i.tolist() for i in np.array_split(links, 10) if i.size>0] 

Как получить тот же вывод без использования numpy или какой-либо внешней библиотеки (предварительно не установленной с python3)?

Воспроизводимый код без каких-либо внешних библиотек будет выглядеть так:

links=range(147)
chunks = [i.tolist() for i in np.array_split(links, 10) if i.size>0]

Требуемый результат - 10 подсписков: длина первых 7 подсписков будет 15, а длина последних 3 подсписков будет 14.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Ввод:

links = list(range(147))
k = 10

Решение итератора:

from itertools import islice
q, r = divmod(len(links), k)
it = iter(links)
chunks = [list(islice(it, q + (i < r))) for i in range(k)]

Решение моржа:

q, r = divmod(len(links), k)
i = 0
chunks = [links[i : (i := i + q + (j < r))] for j in range(k)]
0 голосов
/ 17 февраля 2020

Это не красиво, но этот подход должен быть легко понятным.

import math

L = 147
N = 10
links = range(L)

big_size = math.ceil(L/N)
small_size = math.floor(L/N)
num_big_size = round(N * (L/N - small_size))

chunks = []
ind = 0
for i in range(N):
    if i < num_big_size:
        chunks.append(list(links[ind:ind+big_size]))
        ind += big_size
    else:
        chunks.append(list(links[ind:ind+small_size]))
        ind += small_size

Примечание: это не обрабатывает крайние случаи, как некоторые массивы размером 0. В зависимости от того, что вы хотите, вы можете отфильтровать их.

Другой подход с использованием заполнения

import math

L = 147
N = 10
links = range(L)

big_size = math.ceil(L/N)
small_size = math.floor(L/N)
num_big_size = round(N * (L/N - small_size))

links = list(links)
for i in range((num_big_size+1)*big_size-1, N*big_size, big_size):
    links.insert(i, None)
chunks = [links[i:i+big_size] for i in range(0,N*big_size,big_size)]
chunks = [ [el for el in line if el is not None] for line in chunks]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...