Как разделить список Python на каждый N-й элемент

то, что я пытаюсь сделать, довольно просто, но я не мог найти, как это сделать.

  • начиная с 1-го элемента, поместить каждый 4-й элемент в новый список.
  • повторите со 2-м, 3-м и 4-м элементами.

From:

list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b']

в:

list1 = ['1', '5', '9']
list2 = ['2', '6', 'a']
list3 = ['3', '7', 'b']
list4 = ['4', '9']

иными словами, Мне нужно знать как:

  • получить N-й элемент из списка (в цикле)
  • храните его в новом массивы
  • повторить

2 ответов


специфическое решение использовать отрезать с шагом:

source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b']
list1 = source[::4]
list2 = source[1::4]
list3 = source[2::4]
list4 = source[3::4]

source[::4] принимает каждый 4-й элемент, начиная с индекса 0; другие срезы изменяют только начальный индекс.

на generic решение состоит в том, чтобы использовать цикл для нарезки и сохранить результат во внешнем списке; понимание списка может сделать это красиво:

def slice_per(source, step):
    return [source[i::step] for i in range(step)]

демо:

>>> source = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b']
>>> source[::4]
['1', '5', '9']
>>> source[1::4]
['2', '6', 'a']
>>> def slice_per(source, step):
...     return [source[i::step] for i in range(step)]
... 
>>> slice_per(source, 4)
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']]
>>> slice_per(source, 3)
[['1', '4', '7', 'a'], ['2', '5', '8', 'b'], ['3', '6', '9']]

нумерованные имена-плохая идея, и вы не должны называть свою собственную переменную list (это тени встроенная), но в целом вы можете сделать что-то вроде:

>>> startlist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b']
>>> n = 4
>>> endlist = [[] for _ in range(n)]
>>> for index, item in enumerate(startlist):
    endlist[index % n].append(item)


>>> endlist
[['1', '5', '9'], ['2', '6', 'a'], ['3', '7', 'b'], ['4', '8']]