24

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

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

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

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

4

4 回答 4

45

你想要这样的东西:

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'])
于 2013-04-08T23:29:39.437 回答
4

你可以用一句话来做到这一点

>>> 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']]
于 2013-04-08T23:30:02.750 回答
4

我觉得您必须创建 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']]

希望这可以帮助

于 2013-04-08T23:30:45.747 回答
3

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

您可以使用iter和将列表分块zip

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根据需要创建块,如果你有一个很大的原始列表,这可能很重要。

于 2020-07-04T19:24:12.553 回答