如何将Python列表按每N个元素进行拆分

12

我想做的事情非常简单,但我找不到如何实现。

  • 从第一个元素开始,将每个第四个元素放入新列表中。
  • 重复以上步骤,分别以第二、第三和第四个元素为起点进行操作。

源内容:

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
不要生成新变量。将您的列表存储在父列表中。 - Martijn Pieters
4个回答

23

具体的解决方案是使用带有步长的切片:

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开始计数;其他切片只会改变起始索引。
通用解决方案是使用循环进行切片,并将结果存储在外部列表中;列表推导式可以很好地完成这个任务:
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']]

为什么不将其制作成生成器?这样它也可以处理无限的情况。 - Edgar Klerks
@EdgarKlerks:你需要创建 nislice 迭代器。 - Martijn Pieters
3
@EdgarKlerks: 你似乎在思考如何将列表均匀地分成大小相等的块,在Python中应该怎么做?(https://dev59.com/lnVC5IYBdhLWcg3wYQAp) - Martijn Pieters
请注意,这将更改原始列表中项目的顺序。如果您想要[[0, 1, 2],[3, 4, 5]]样式的输出,则此方法不适用。(是的,在这个问题上上面的答案是正确的,但我正在寻找这种类型的输出并在谷歌上偶然发现了这个。)最终使用了这个 - zertap
1
@zertap,顺序没有改变,我们按顺序选择每个第四个元素。你想要的是不同的东西,你想要取固定大小的块,请参见What is the most "pythonic" way to iterate over a list in chunks? - Martijn Pieters
显示剩余2条评论

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
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)

3
即使解释只有一行,大约只有一个句子,也需要对这样的回答进行说明。请考虑更新您的回答。 - Jenea Vranceanu

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 的方法 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接