【问题标题】:How to sort multidimensional array by column?如何按列对多维数组进行排序?
【发布时间】:2013-12-09 14:07:40
【问题描述】:

有没有办法使用 sort() 方法或任何其他方法按列对列表进行排序?假设我有清单:

[
[John,2],
[Jim,9],
[Jason,1]
]

我想对其进行排序,使其看起来像这样:

[
[Jason,1],
[John,2],
[Jim,9],
]

最好的方法是什么?

编辑:

现在我遇到了索引超出范围错误。我有一个二维数组,可以说 1000 行 b 3 列。我想根据第三列对其进行排序。这是正确的代码吗?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2])

【问题讨论】:

  • 现在我遇到了索引超出范围错误。我有一个二维数组,可以说 1000 行 b 3 列。我想根据第三列对其进行排序。这是正确的代码吗? sorted_list = sorted(list_not_sorted, key=lambda x:x[2])
  • 响应您的编辑,由于列表是零索引的,是的 x[2] 是第三列。故事的寓意是,您可以使用键和 lambda 或实际函数按照 sortedsort 函数中的某些规定进行排序。

标签: python arrays list sorting


【解决方案1】:

如果所需数字是浮点数,以下解决方案对我有用。 解决方案:

table=sorted(table,key=lambda x: float(x[5]))
for row in table[:]:
    Ntable.add_row(row)

'

【讨论】:

    【解决方案2】:
    sorted(list, key=lambda x: x[1])
    

    注意:这也适用于时间变量。

    【讨论】:

      【解决方案3】:

      是的。 sorted 内置接受 key 参数:

      sorted(li,key=lambda x: x[1])
      Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]]
      

      注意sorted 返回一个新列表。如果您想就地排序,请使用列表的 .sort 方法(也方便地接受 key 参数)。

      或者,

      from operator import itemgetter
      sorted(li,key=itemgetter(1))
      Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]]
      

      Read more on the python wiki.

      【讨论】:

      • 可能要提一下,这将返回一个新列表。
      • 确实如此。如果你想修改原始列表,那就是li.sort(key=whatever)
      • 我怎样才能得到自然排序?就像这里根据数字位置排序的那样,“411”将首先排序,然后是“67”。
      • @AbhishekJain 您的数据类型是字符串,这就是“411”在“67”之前出现的原因。 Convert to number
      【解决方案4】:

      您可以将list.sort 与可选的key parameterlambda expression 一起使用:

      >>> lst = [
      ...     ['John',2],
      ...     ['Jim',9],
      ...     ['Jason',1]
      ... ]
      >>> lst.sort(key=lambda x:x[1])
      >>> lst
      [['Jason', 1], ['John', 2], ['Jim', 9]]
      >>>
      

      这将对列表进行就地排序。


      请注意,对于大型列表,使用 operator.itemgetter 而不是 lambda 会更快:

      >>> from operator import itemgetter
      >>> lst = [
      ...     ['John',2],
      ...     ['Jim',9],
      ...     ['Jason',1]
      ... ]
      >>> lst.sort(key=itemgetter(1))
      >>> lst
      [['Jason', 1], ['John', 2], ['Jim', 9]]
      >>>
      

      【讨论】:

      • “lambda”键到底是什么?
      • @user3024130 - lambdakey 参数创建一个内联函数。我添加了一个链接以更好地解释。使用lambda 与使用def func(x): return x[1] 然后lst.sort(key=func) 没有什么不同。
      • 好吧,这是有道理的。你会如何将它从高到低而不是从低到高排序?
      • @user3024130 - 很简单。使用这个:lst.sort(key=lambda x:x[1], reverse=True)list.sort 还采用可选的 reverse 参数。如果设置为True,则列表从高到低排序。否则,从最低到最高。
      【解决方案5】:

      sort/sorted 的可选参数key 是一个函数。为每个项目调用该函数,返回值确定排序的顺序

      >>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]]
      >>> def my_key_func(item):
      ...     print("The key for {} is {}".format(item, item[1]))
      ...     return item[1]
      ... 
      >>> sorted(lst, key=my_key_func)
      The key for ['John', 2] is 2
      The key for ['Jim', 9] is 9
      The key for ['Jason', 1] is 1
      [['Jason', 1], ['John', 2], ['Jim', 9]]
      

      print 从函数中取出

      >>> def my_key_func(item):
      ...     return item[1]
      

      这个函数很简单,可以把“内联”写成一个 lambda 函数

      >>> sorted(lst, key=lambda item: item[1])
      [['Jason', 1], ['John', 2], ['Jim', 9]]
      

      【讨论】:

        【解决方案6】:

        您可以使用带键的排序方法。

        sorted(a, key=lambda x : x[1])
        

        【讨论】:

          猜你喜欢
          • 2014-05-13
          • 2011-03-15
          • 2015-06-28
          • 2021-07-11
          • 2011-03-17
          相关资源
          最近更新 更多