【问题标题】:How to sort a list of lists by a specific index of the inner list?如何按内部列表的特定索引对列表列表进行排序?
【发布时间】:2011-05-09 15:56:47
【问题描述】:

我有一个列表列表。例如,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

如果我想通过内部列表的字符串字段对外部列表进行排序,你会如何在 python 中做到这一点?

【问题讨论】:

标签: python sorting


【解决方案1】:

使用自定义键功能,您可以轻松地根据需要对任何列表进行排序:

L = [[0,1,'f'], [4,2,'t'], [9,4,'afsd']]

def sorter(lst):
    return lst[2].casefold()

L.sort(key=sorter)

# result: [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

【讨论】:

    【解决方案2】:

    确保在要排序的列表中没有任何 null 或 NaN 值。如果有 NaN 值,那么您的排序将被关闭,影响非空值的排序。

    查看Python: sort function breaks in the presence of nan

    【讨论】:

      【解决方案3】:

      对多维数组进行排序execute here

      arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]
      
      
      
      arr.sort(key=lambda x:x[0])
      la=set([i[0] for i in Points])
      
      for i in la:
          tempres=list()
          for j in arr:
              if j[0]==i:
                  tempres.append(j[1])
      
          for j in sorted(tempres,reverse=True):
              print(i,j)
      

      【讨论】:

        【解决方案4】:
        **old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
            #let's assume we want to sort lists by last value ( old_list[2] )
            new_list = sorted(old_list, key=lambda x: x[2])**
        

        如果我错了,请纠正我,但不是“x[2]”调用列表中的第 3 项,而不是嵌套列表中的第 3 项?应该是 x[2][2] 吗?

        【讨论】:

        • 不,因为 key/lambda 已经在迭代第一级列表中的项目。 x 是依次绑定到每个项目的局部变量。
        【解决方案5】:

        更容易理解(Lambda 实际在做什么):

        ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
        def thirdItem(ls):
            #return the third item of the list
            return ls[2]
        #Sort according to what the thirdItem function return 
        ls2.sort(key=thirdItem)
        

        【讨论】:

          【解决方案6】:
          array.sort(key = lambda x:x[1])
          

          您可以使用这个 sn-p 轻松排序,其中 1 是元素的索引。

          【讨论】:

            【解决方案7】:

            我认为 lambda 函数可以解决你的问题。

            old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
            
            #let's assume we want to sort lists by last value ( old_list[2] )
            new_list = sorted(old_list, key=lambda x: x[2])
            
            #Resulst of new_list will be:
            
            [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]
            

            【讨论】:

              【解决方案8】:

              多个条件也可以通过lambda函数实现

              sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))
              

              【讨论】:

              • 上面这个lambda函数是什么意思。它是否返回一个元组?
              【解决方案9】:

              Itemgetter 允许您按多个条件/列进行排序:

              sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))
              

              【讨论】:

              • 我觉得这个答案很重要。我认为尝试按内部数组索引排序的人会落在这里,但希望按 MULTIPLE 内部数组索引排序的人将从这里开始,您的回答帮助我看到 itemgetter 实际上会为您做到这一点!
              【解决方案10】:

              这是itemgetter的工作

              >>> from operator import itemgetter
              >>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
              >>> sorted(L, key=itemgetter(2))
              [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]
              

              这里也可以使用 lambda 函数,但是在这个简单的例子中 lambda 函数比较慢

              【讨论】:

              • 如果我想忽略大小写怎么办?
              • @bzupnick,使用key=lambda x:x[2].casefold()。如果您的 Python 不够新,只需使用 .lower() 而不是 .casefold()
              • x = [[[5,3],1.0345],[[5,6],5.098],[[5,4],4.89],[[5,1],5.97] ] 对于这样的列表,我们可以使用 itemgetter() 对 x[0][1] 中的元素进行排序吗?
              • 我也可以得到排序的索引,以便以相同的顺序对另一个相关的列表列表进行排序吗?
              • @quaryk 这听起来是个有趣的问题,但不适合在 cmets 中回答。如果您找不到涵盖它的问题,您应该创建一个。
              【解决方案11】:

              到位

              >>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
              >>> l.sort(key=lambda x: x[2])
              

              未使用 sorted:

              >>> sorted(l, key=lambda x: x[2])
              

              【讨论】:

              • 您能否提供更多有关in placenot in place 的详细信息?
              • @qun, "in place" 表示旧列表的内存被重新用于排序的列表。 “未到位”表示旧列表保持不变,并创建一个新列表。
              • x = [[[5,3],1.0345],[[5,6],5.098],[[5,4],4.89],[[5,1],5.97] ] 有了这样的列表,我们如何对 x[0][1] 中的元素进行排序?
              • 降序排列:l.sort(key=lambda x: x[2], reverse=True)
              【解决方案12】:

              像这样:

              import operator
              l = [...]
              sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))
              

              【讨论】:

                猜你喜欢
                • 2016-09-10
                • 1970-01-01
                • 2018-01-30
                • 2015-07-25
                • 2017-04-08
                • 2016-08-30
                • 2022-01-08
                • 1970-01-01
                相关资源
                最近更新 更多