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

Posted

技术标签:

【中文标题】如何拆分Python列表每第N个元素【英文标题】:How to Split Python list every Nth element 【发布时间】:2015-01-12 17:55:21 【问题描述】:

我想做的很简单,但我找不到怎么做。

从第一个元素开始,将每第四个元素放入一个新列表中。 重复第 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】:

具体的解决方法是使用slicing with a stride:

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

【讨论】:

为什么不把它做成发电机呢?它也会处理无限情况。 @EdgarKlerks:那么你必须创建 n islice 迭代器。 @EdgarKlerks:这意味着您必须对输入迭代进行开球,这可能会变得非常昂贵,内存明智。 @EdgarKlerks:看来你在想How do you split a list into evenly sized chunks in Python?.. @zertap 顺序没有改变,我们选择每 4 个元素按顺序。你想要的是不同的东西,你想要固定大小的块,见What is the most "pythonic" way to iterate over a list in chunks?。【参考方案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']]

【讨论】:

【参考方案3】:
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)

【讨论】:

这样的答案需要解释,即使解释是一行长并且大致由一个句子组成。考虑更新您的答案。【参考方案4】:

替代方法:

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 = []

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

这更像是一种数学方法,而不是 Python 方法:)

【讨论】:

以上是关于如何拆分Python列表每第N个元素的主要内容,如果未能解决你的问题,请参考以下文章

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

每第n个字符拆分字符串?

如何在python中将列表拆分为没有重复元素的子集

python - 如何首先根据初始列表的单个元素将列表拆分为子列表,然后在python中将列表的连续部分拆分为子列表?

如何将列与列组合以获取数据列表中的结果(Python)?

python怎么将列表中元素分配成三份(无需连续),列举出所有的方案?