Как разделить список на n равных частей, python
Возможный дубликат:
Как вы разбиваете список на четные фрагменты в Python?
Учитывая (любой) список слов lst
Я должен разделить его на 10 равных частей.
x = len(lst)/10
как передать эти части именам переменных?
На выходе мне нужно 10 переменных (part1, part2... part10
) с x
количеством слов в нем.
любые идеи?
Ответы
Ответ 1
One-liner возвращает список списков, учитывая список и размер блока:
>>> lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]
Тестирование:
>>> x = range(20, 36)
>>> print x
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
>>> lol(x, 4)
[[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]]
>>> lol(x, 7)
[[20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 31, 32, 33],
[34, 35]]
Update:
Я думаю, что действительно заданный вопрос - это функция, которая, учитывая список и число, возвращает список, содержащий списки $(number), причем элементы исходного списка распределены равномерно. Поэтому ваш пример lol (x, 7) должен действительно вернуться [[20,21,22], [23,24,25], [26,27], [28,29], [30,31], [32, 33], [34,35]]. - markrian
Ну, в этом случае вы можете попробовать:
def slice_list(input, size):
input_size = len(input)
slice_size = input_size / size
remain = input_size % size
result = []
iterator = iter(input)
for i in range(size):
result.append([])
for j in range(slice_size):
result[i].append(iterator.next())
if remain:
result[i].append(iterator.next())
remain -= 1
return result
Я уверен, что это можно улучшить, но я чувствую себя ленивым.: -)
>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25],
[26, 27], [28, 29],
[30, 31], [32, 33],
[34, 35]]
Ответ 2
См. этот вопрос о том, как создавать равные куски списка. Затем, если вы действительно нуждаетесь в них в отдельных переменных, вы можете сделать:
part1, part2, ..., part10 = (part for part in chunks(lst, len(lst)/10))
Но я бы рекомендовал сделать код более общим, а не жестко кодировать его на 10 частей.
Ответ 3
Я напишу этот код, чтобы вы узнали технику, но вы не должны этого делать. Точка типов данных контейнера, таких как list
и set
, состоит в том, что вы можете иметь произвольное содержимое без необходимости создавать переменные для каждого элемента. Таким образом,
Не делайте этого
>>> def chunks(l, n):
... for i in xrange(0, len(l), n):
... yield l[i:i+n]
...
>>> for i, chunk in enumerate(chunks(range(100), 10)):
... locals()["part{0}".format(i)] = chunk
...
>>> part0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> part1
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> part2
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
(рецепт chunks
от Ответ Ned Batchelder в связанном вопросе. Причина, по которой вы не должны этого делать, заключается в том, что изменение locals
(или действительно globals
или vars
) не является хорошей практикой: он вызывает трудноопределяемое поведение и, возможно, очень неприятные ошибки.
Ответ 4
Если вам не нужно принудительно использовать смежные элементы выходных элементов, следующий рабочий фрагмент выполнит следующее задание:
def even_divide(lst, num_piece=4):
return [
[lst[i] for i in range(len(lst)) if (i % num_piece) == r]
for r in range(num_piece)
]
В основном код группирует элементы на основе по модулю остатков. И из-за этого элементы в выходном списке не будут смежными. Например, если вход range(21)
, вместо
[[0, 1, 2, 3, 4, 5],[6, 7, 8, 9, 10],[11, 12, 13, 14, 15],[16, 17, 18, 19, 20]]
вы получите
[[0, 4, 8, 12, 16, 20],[1, 5, 9, 13, 17],[2, 6, 10, 14, 18],[3, 7, 11, 15, 19]]
Надеюсь, что это поможет.
Ответ 5
Использовать кортеж/список результата - наиболее разумный подход
Если вам нужно определить новые переменные, вы можете
Ответ 6
Увидел несколько решений, но не смог помочь мне:
# List
lst = range(103)
# number of slices
nSlices = 10
# splitted list
slices = [len(lst) // (nSlices)] * nSlices
# but points are still missing!
remainder = len(lst)-sum(slices)
# split missing points across slices
slices[:remainder] = [ii + 1 for ii in slices[:remainder]]
splittedList = [lst[sum(slices[:ii]):sum(slices[:ii+1])] for ii in range(nSlices)]
print lst
print '\n'.join("{}".format(n) for n in splittedList)
Возможно, можно, конечно, обобщить, но я думаю, что это понятно, что читать.