在python中对列表的各个组件进行排序

时间:2014-06-09 19:32:53

标签: python list sorting

我有一个包含1000个三维列表的列表。

[[ 0.17  0.045  0.01]
[ 0.28  0.10 0.19]
[ 0.31  0.19  0.09]
..., 
[ 0.36  0.42  0.38]
[ 0.62  0.02  0.03]
[ 0.32  0.12  0.26]]

是否有快速方法对列表中的各个组件进行排序,而不是通过迭代列表的繁琐方式?例如,在上面的例子中,如果我只有6个列表(在外部列表中),我想得到3个列表,每个列表包含按升序排序的6个元素。

[ 0.17, 0.28, 0.31, 0.32, 0.36, 0.62 ]
[ 0.02, 0.045, 0.10, 0.12, 0.19, 0.42 ]
[ 0.01, 0.03, 0.09, 0.19, 0.26, 0.38 ]

另一个小问题,如何打印所有1000个列表。如果只有100个列表,如果我使用print语句但是对于1000个列表,则会打印所有列表,如果我使用print,则不会打印所有1000个列表(如上所述...打印3列表后打印)。如果我使用

,我可以打印所有这些
for i in list_coll: print i

但是没有更直接的方法吗?

2 个答案:

答案 0 :(得分:3)

如果你有一个列表列表,你可以获得排序列表,你可以在列表理解中使用zip

[sorted(entry) for entry in zip(*list_coll)]

只要它们都具有相同数量的项目,无论每个子列表中有多少项目,这都将起作用。例如:

>>> list_coll = [[1, 2, 3], [4, 5, 6], [-1, -2, -3], [7, 8, 9]]
>>> [sorted(entry) for entry in zip(*list_coll)]
[[-1, 1, 4, 7], [-2, 2, 5, 8], [-3, 3, 6, 9]]
>>> list_coll = [[1, 2, 3, 4], [5, 6, 7, 8], [-1, -2, -3, -4], [9, 10, 11, 12]]
>>> [sorted(entry) for entry in zip(*list_coll)]
[[-1, 1, 5, 9], [-2, 2, 6, 10], [-3, 3, 7, 11], [-4, 4, 8, 12]]

如果您有一个包含较少项目的子列表,那么这实际上仍然可以工作,但只能对最小子列表中的项目数进行排序。例如:

>>> list_coll = [[1, 2, 3, 4, 5, 6, 7], [5, 6, 7, 8, 9], [-1, -2, -3], [9, 10, 11, 12, 13]]
>>> [sorted(entry) for entry in zip(*list_coll)]
[[-1, 1, 5, 9], [-2, 2, 6, 10], [-3, 3, 7, 11]]

答案 1 :(得分:2)

如果你有一个2d numpy数组,你可以在数组上使用sort方法,并指定axis=0

>>> d
array([[ 0.17 ,  0.045,  0.01 ],
       [ 0.28 ,  0.1  ,  0.19 ],
       [ 0.31 ,  0.19 ,  0.09 ],
       [ 0.36 ,  0.42 ,  0.38 ],
       [ 0.62 ,  0.02 ,  0.03 ],
       [ 0.32 ,  0.12 ,  0.26 ]])
>>> d2 = d.copy()
>>> d2.sort(axis=0)
>>> d2
array([[ 0.17 ,  0.02 ,  0.01 ],
       [ 0.28 ,  0.045,  0.03 ],
       [ 0.31 ,  0.1  ,  0.09 ],
       [ 0.32 ,  0.12 ,  0.19 ],
       [ 0.36 ,  0.19 ,  0.26 ],
       [ 0.62 ,  0.42 ,  0.38 ]])

如果你想处理行而不是列,你可以转置它:

>>> d2.T
array([[ 0.17 ,  0.28 ,  0.31 ,  0.32 ,  0.36 ,  0.62 ],
       [ 0.02 ,  0.045,  0.1  ,  0.12 ,  0.19 ,  0.42 ],
       [ 0.01 ,  0.03 ,  0.09 ,  0.19 ,  0.26 ,  0.38 ]])
>>> for row in d2.T:
...     print(row)
...     
[ 0.17  0.28  0.31  0.32  0.36  0.62]
[ 0.02   0.045  0.1    0.12   0.19   0.42 ]
[ 0.01  0.03  0.09  0.19  0.26  0.38]

等等。