如何拆分每个第N个元素的Python列表

时间:2014-11-15 11:23:57

标签: python arrays list loops split

我想做的事情很简单,但我找不到如何去做。

  • 从第一个元素开始,将每个第四个元素放入一个新列表中。
  • 重复第2,第3和第4个元素。

自:

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个元素(在循环中)
  • 将其存储在新数组中
  • 重复

4 个答案:

答案 0 :(得分:13)

具体的解决方案是使用步幅切片:

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]从索引0开始每4个元素;其他切片只会改变起始索引。

泛型解决方案是使用循环来进行切片,并将结果存储在外部列表中;列表理解可以做得很好:

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']]

答案 1 :(得分:4)

编号的名称是个坏主意,你不应该命名自己的变量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']]

答案 2 :(得分:0)

替代方法:

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

for _, __ in enumerate(list, 1):
  list_temp.append(__)
  if _ % 3 == 0 or _ == len(list):
    lists.append(list_temp)
    list_temp = []

每当索引除以所需的列表长度而没有余数时,这会将块添加到临时列表中,并将临时列表附加到我们的最终列表中。

它比pythonic更具数学意义:)

答案 3 :(得分:0)

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
s = []
n = 3
for x in range(n):
    s.append(lst[x::n])
    print(s)