将清单变成清单清单

时间:2019-11-18 15:00:11

标签: python arrays list

我正在编写一个函数,该函数采用columns = c和rows = r(两者都可以不相等!),并且应该是一个列表列表,其中每一行都是一个包含c元素的列表,列表中的所有行。给定下面的列表,如何创建此类子列表?

list = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]

应返回:

[[0, 0, 0, 0, 0], [1, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0], [0, 1, 0, 1, 1]]

我尝试使用split(),但似乎仅适用于字符串。

6 个答案:

答案 0 :(得分:2)

脾气暴躁:

import numpy
c, r = 4, 5
list_ = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0]
numpy.array(list_).reshape(c, r).tolist()

#out (shortened example list to avoid 5x5):
[[0, 0, 0, 0, 0], [1, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0]]

但是,如果您的目标是创建“带有零和一的cxr数组”,则最好使用:

numpy.random.randint(0, high=2, size=(c, r))

# out
array([[1, 1, 1, 0, 0],
       [1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0],
       [1, 0, 0, 1, 0]])

答案 1 :(得分:1)

您可以使用list comprehension

c, r = 4, 5
list = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]

list_of_lists = [list[i - c: i] for i in range(c, len(list), c)]

答案 2 :(得分:1)

l= [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]

print([L[i:i+4] for i in range(0,len(L),4)])

输出:

[[0, 0, 0, 0], [0, 1, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1], [1, 1, 1, 0], [0, 1, 0, 1], [1]]

答案 3 :(得分:1)

使用itertools.islice(也不要将list用作变量名。它将替换内置函数)

from itertools import islice

def chunker(data, rows, columns):
    d = iter(data)
    return  [list(islice(d, cols)) for row in range(rows)]

data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]
result = chunker(data, 4, 5)

结果:

[[0, 0, 0, 0, 0],
 [1, 1, 0, 1, 1],
 [0, 0, 1, 1, 1],
 [1, 1, 1, 1, 0]]

答案 4 :(得分:1)

使用切片和列表理解。

  new_list=[list[i:i+5] for i in range(len(list)//5)]

只要这样做就可以了。

a sample usage screenshot

答案 5 :(得分:0)

尝试一下:

ls = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1]

[ls[i*5:i*5+5] for i in range(len(ls)//5)]
Out[1]: 
[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 1, 1],
 [0, 0, 1, 1, 0],
 [0, 1, 1, 0, 1]]

或作为功能:

def split_list(list, length):
   return [list[i*length:i*length+length] for i in range((len(list)//length))]

split_list(ls, 5)