How can I sort a 2D list?

蹲街弑〆低调 提交于 2019-12-13 06:46:38

问题


I'm working with a 2D list of numbers similar to the example below I and am trying to reorder the columns:

D C B A

1 3 2 0

1 3 2 0

1 3 2 0

The first row of the list is reserved for letters to reference each column. How can I sort this list so that these columns are placed in alphabetical order to achieve the following:

D C B A    A B C D

1 3 2 0    0 2 3 1

1 3 2 0    0 2 3 1

1 3 2 0    0 2 3 1

I've found examples that make use of lambdas for sorting, but have not found any similar examples that sort columns by characters.

I'm not sure how to achieve this sorting and would really appreciate some help.


回答1:


Assume values stored row-by-row in list, like that:

a = [['D', 'C', 'B', 'A'],
     ['1', '3', '2', '0'],
     ['1', '3', '2', '0']]

To sort this array you can use following code:

zip(*sorted(zip(*a), key=lambda column: column[0]))

where column[0] - value to be sorted by (you can use column1 etc.)

Output:

[('A', 'B', 'C', 'D'),
 ('0', '2', '3', '1'),
 ('0', '2', '3', '1')]

Note: If you are working with pretty big arrays and execution time does matter, consider using numpy, it has appropriate method: NumPy sort




回答2:


zip() the 2D list, sort by the first item, then zip() again.

>>> table = [['D', 'C', 'B', 'A',],
...          [1, 3, 2, 0,],
...          [1, 3, 2, 0],
...          [1, 3, 2, 0]]
>>> for row in zip(*sorted(zip(*table), key=lambda x: x[0])):
...     print(*row)
...
A B C D
0 2 3 1
0 2 3 1
0 2 3 1


来源:https://stackoverflow.com/questions/34845096/how-can-i-sort-a-2d-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!