【问题标题】:What would be the most efficient/clean way to deeply sort a multidimensional list in Python?在 Python 中对多维列表进行深度排序的最有效/最干净的方法是什么?
【发布时间】:2011-12-20 18:13:09
【问题描述】:

示例:
从此列表中:

list = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]]

我想要:

print list
[[1, 1, 1], [2, 4, 9], [10, 11, 16]]

是否可以使用 list.sort() 函数或者我必须编写自定义循环?

【问题讨论】:

  • 你确定你想要的是 [[1, 1, 1], [2, 4, 9], [10, 11, 16]] 而不是 Max 建议的 [[2, 1, 1], [4, 11, 16], [10, 9, 1]] 吗?
  • ups )) 我完全误解了这个问题。投票删除我的答案。
  • 是的,我想对值进行排序,而不是嵌套列表。
  • 您不太可能在标准库中找到执行此操作的内容,因为它需要在数据结构之间交换值——以一般方式执行此操作将非常复杂。最有效的方法是编写一个可以使用二维索引的自定义快速排序。最简洁的方法是将列表展平,对其进行排序,然后重建嵌套列表。

标签: python arrays list sorting multidimensional-array


【解决方案1】:

这是一个扁平化、排序然后重建嵌套列表的示例,正​​如上面 cmets 中 @Inerdia 所建议的那样。

我已尝试尽可能使用生成器和迭代器,但我确信有更聪明、更有效的方法来获得结果!

from itertools import izip

l = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]]
# flatten the list and sort it
f = sorted(inner for outer in l for inner in outer)
# group it into 3s again using izip
new_list = [list(l) for l in izip(*[iter(f)]*3)]

【讨论】:

    【解决方案2】:
    >>> l = [[10, 9, 1], [2, 1, 1,], [4, 11, 16]]
    >>> L = sorted([sub[i] for sub in l for i in range(3)])
    >>> print L
    [1, 1, 1, 2, 4, 9, 10, 11, 16]
    

    现在您可以将L 分组为 3 个一组

    【讨论】:

    • 我认为你的意思是 L = sorted([sub[i] for sub in l for i in range(3)]) 谢谢,我猜这样就行了
    猜你喜欢
    • 2010-11-07
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多