python list操作垂直嵌套,使其看起来像一个矩阵

时间:2014-04-09 05:30:20

标签: python

我有以下列表。在python中它看起来像[15,20,25,35,-20... etc]

15  20  25  35  -20 -15 -10 -5
10  15  20  25  -25 -20 -15 -10
5   10  15  20  -35 -25 -20 -15

我想像这样垂直嵌套:

[[15,10,5],[20,15,10],[25,20,15],[35,25,20],[-20,-25,-35],...etc]

所以它涉及某种转置操作,但是向后计数,例如transpose会为列表中的第一项

提供[5,10,15]而不是[15,10,5]

最好的方法是什么? (最短和最可读的代码)

如果有人对最短的运行时间也有建议,那么对更大的数据集也会有帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用列表推导对元素进行分组,然后使用zip函数对其进行转置,就像这样

data = [15, 20, 25, 35, -20, -15, -10, -5, 10, 15, 20,
        25, -25, -20, -15, -10, 5, 10, 15, 20, -35, -25, -20, -15]
length = len(data) / 3
data = [data[i:i + length] for i in xrange(0, len(data), length)]

直到这一点,我们将数据分组为

[[15, 20, 25, 35, -20, -15, -10, -5],
 [10, 15, 20, 25, -25, -20, -15, -10],
 [5, 10, 15, 20, -35, -25, -20, -15]]

现在,我们只需转置datazip

print zip(*data)

<强>输出

[(15, 10, 5),
 (20, 15, 10),
 (25, 20, 15),
 (35, 25, 20),
 (-20, -25, -35),
 (-15, -20, -25),
 (-10, -15, -20),
 (-5, -10, -15)]

zip(*data)表示我们解包data的所有元素,并将每个元素作为参数传递给zip。它相当于

zip(data[0], data[1], data[2])

答案 1 :(得分:2)

from pprint import pprint
from operator import itemgetter
lst = [15, 20, 25, 35, -20, -15, -10, -5, 10, 15, 20, 25, -25,\
       -20, -15, -10, 5, 10, 15, 20, -35, -25, -20, -15]

# Python 3
l = len(lst) // 3
# Or a single slash in Python 2: l = len(lst) / 3

# Just for diversity
a = [itemgetter(*range(x, x+l))(lst) for x in range(0, len(lst), l)]

pprint(list(zip(*a)))

输出:

[(15, 10, 5),
 (20, 15, 10),
 (25, 20, 15),
 (35, 25, 20),
 (-20, -25, -35),
 (-15, -20, -25),
 (-10, -15, -20),
 (-5, -10, -15)]