如何将每个 x 个元素拆分一个列表并将这些 x 个元素添加到一个新列表中?

Posted

技术标签:

【中文标题】如何将每个 x 个元素拆分一个列表并将这些 x 个元素添加到一个新列表中?【英文标题】:How can you split a list every x elements and add those x amount of elements to an new list? 【发布时间】:2013-03-31 05:19:57 【问题描述】:

我有一个包含多个整数和字符串的列表

['-200', ' 0', ' 200', ' 400', ' green', '0', '0', '200', '400', ' yellow', '200', '0', '200', '400', ' red']

我很难将每个 5 elements 的列表分开并创建一个只有 5 个元素的新列表。

但是,我不想要 3 个不同的列表,我只想要一个在每次新的 5 elements 通过时都会更改。

【问题讨论】:

【参考方案1】:

我在之前的answer 中使用zip 详细介绍了一种稍微不同的方法。上一个答案作为此答案的副本已关闭,因此我在此处添加我的答案以供参考。

您可以使用iterzip 将列表分块。

def chunk(lst, n):
    return zip(*[iter(lst)]*n)

例子:

In []:
data = ['-200', ' 0', ' 200', ' 400', ' green', '0', '0', '200', '400',
        ' yellow', '200', '0', '200', '400', ' red']

for l in chunk(data, 5):
    print(l)

Out[]:
('-200', ' 0', ' 200', ' 400', ' green')
('0', '0', '200', '400', ' yellow')
('200', '0', '200', '400', ' red')

如果您希望它们出现在列表中,那么:

In []:
list(chunk(data, 5))

Out[]:
[('-200', ' 0', ' 200', ' 400', ' green'), ('0', '0', '200', '400', ' yellow'),  
 ('200', '0', '200', '400', ' red')]

解释:

def chunk(lst, n):
    it = iter(lst)       # creates an iterator
    its = [it]*n         # creates a list of n it's (the same object)
    return zip(*its)     # unpack the list as args to zip(), e.g. when `n=3` - zip(it, it, it)

因为zip() 在同一个迭代器n 上运行,所以它会将原始lst 分块为n 组。

在 Py3 中,这是惰性的(zip() 返回一个迭代器),因此只会根据需要创建 n 的块,如果您有一个很大的原始列表,这可能很重要。

【讨论】:

【参考方案2】:

你可以在一个句子中做到这一点

>>> import math
>>> s = ['-200', ' 0', ' 200', ' 400', ' green', '0', '0', '200', '400', ' yellow', '200', '0', '200', '400', ' red']
>>> [s[5*i:5*i+5] for i in range(0,math.ceil(len(s)/5))]

那么输出应该是:

[['-200', ' 0', ' 200', ' 400', ' green'], ['0', '0', '200', '400', ' yellow'], ['200', '0', '200', '400', ' red']]

【讨论】:

【参考方案3】:

我觉得您必须创建 1 个新列表,但如果我理解正确,您需要一个嵌套列表,每个子列表中有 5 个元素。

您可以尝试以下方法:

l = ['-200', ' 0', ' 200', ' 400', ' green', '0', '0', '200', '400', ' yellow', '200', '0', '200', '400', ' red']

new = []
for i in range(0, len(l), 5):
    new.append(l[i : i+5])

这将逐步遍历您的第一个列表“l”,并将 5 个元素组合到 new 中的子列表中。输出:

[['-200', ' 0', ' 200', ' 400', ' green'], ['0', '0', '200', '400', ' yellow'], ['200', '0', '200', '400', ' red']]

希望对你有帮助

【讨论】:

【参考方案4】:

你想要这样的东西:

composite_list = [my_list[x:x+5] for x in range(0, len(my_list),5)]

print (composite_list)

输出:

[['-200', ' 0', ' 200', ' 400', ' green'], ['0', '0', '200', '400', ' yellow'], ['200', '0', '200', '400', ' red']]

“新”5 个元素是什么意思?

如果你想追加到这个列表,你可以这样做:

composite_list.append(['200', '200', '200', '400', 'bluellow'])

【讨论】:

以上是关于如何将每个 x 个元素拆分一个列表并将这些 x 个元素添加到一个新列表中?的主要内容,如果未能解决你的问题,请参考以下文章

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

将元素列表拆分为组

Python Pyx Plot:如何拆分图键?

在每个谓词 scala 处将字符串列表拆分为多个列表

如何更改嵌套列表中的元素?

如何更改列表中的每个元素?