我有以下列表。在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]
最好的方法是什么? (最短和最可读的代码)
如果有人对最短的运行时间也有建议,那么对更大的数据集也会有帮助。
答案 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]]
现在,我们只需转置data
,zip
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)]