2014-11-15 206 views
7

我想要做的事很简单,但我找不到如何去做。如何拆分每个第N个元素的Python列表

  • 从第1个元素开始,将每个第4个元素放到一个新列表中。
  • 重复第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个元素(一个循环)
  • 将它存储在新阵列中
  • 重复
+1

不产生新的变数。请将您的列表存储在父列表中。 –

回答

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;其他切片仅改变起始索引。

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

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

为什么不把它变成一个发电机?那么它也会处理无限的情况。 –

+0

@EdgarKlerks:那你必须制作'n'' islice'迭代器。 –

+0

@EdgarKlerks:这意味着你不得不开始迭代输入,并且这可能会变得非常昂贵,而且内存也很明智。 –

2

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