【问题标题】:lexicographically sorting a list containing lists按字典顺序对包含列表的列表进行排序
【发布时间】:2021-10-31 20:08:25
【问题描述】:

我有一个从二维数组生成的列表,如下所示

a = [[4,3],[4,5]]

列表a中的每一项都是从二维数组感兴趣的坐标中收集的行、列

我想对这个列表 a 进行排序,这样我就可以获得字典上最小的行,在这种情况下是 [4,3] 的列

我试过了

np.lexsort([[4,3],[4,5]])

但它无法理解输出。

【问题讨论】:

    标签: python numpy sorting lexicographic


    【解决方案1】:

    np.lexsort 使用最后一个元素作为主键,因此在您的示例中它首先对 35 进行排序。如果您想使用第一个元素作为键,您可以执行以下操作:

    import numpy as np
    a = np.array([[4,3],[4,5],[5,2],[5,6]])
    print(np.lexsort(np.fliplr(a).T))
    

    输出:

    [0 1 2 3]
    

    输出表明第一个元素[4,3] 是最小的,因此该元素的值是0

    【讨论】:

      【解决方案2】:

      你说 “我想对这个列表 a 进行排序,这样我就可以得到字典上最小的行,在这种情况下是 [4,3] 的列”。但是,如果您感兴趣的只是获取列表中的最小元素,那么您就不需要对它进行排序。你可以使用builtin function min

      最小行

      在python中排序和取最小值都默认使用字典顺序,所以你可以直接调用min

      a = [[4,3],[4,5]]
      min_row = min(a)
      print(min_row)
      # [4, 3]
      

      最小列

      如果您想按字典顺序获取 min 列,则需要转置列表列表,以便内部列表与列相对应。请参阅此相关问题:Transpose list of liststhe documentation on zip

      a = [[4,3],[4,5]]
      min_col = min(zip(*a))
      print(min_col)
      # (3, 5)
      

      排序

      如果你真的想排序而不是取最小元素,那么你可以使用.sort()sorted( ) 而不是min( )

      a = [[4,3],[4,5]]
      
      # sorting a copy
      sorted_rows = sorted(a)
      print(sorted_rows)
      
      # sorting in-place
      a.sort()
      print(a)
      

      【讨论】:

      • 感谢您的回答。我举的例子很简单。如果我必须测试很多用例,我认为排序是最好的选择。
      • @MosesSoleman 这完全取决于“许多用例”的含义。
      • 如果我必须决定 [[4,5], [6,3], [7,2]] 哪个更小?
      • @MosesSoleman 如果您在n 行的表中寻找k 最小的行,使用k numpy.argpartitionheapq.nlargest 而不是排序
      • @MosesSoleman 然后我建议你问一个新问题,更完整地解释你想要什么。很难/不可能从您实际提出的问题和这些 cmets 中理解/猜测您想要什么。或者更确切地说,要提出一个新问题,您可能需要一些时间并尝试自己找到一种算法来解决您的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2018-11-27
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多