代码之家  ›  专栏  ›  技术社区  ›  Giovanni Di Milia

python:如何在两个不同的键上对复杂列表进行排序

  •  10
  • Giovanni Di Milia  · 技术社区  · 14 年前

    我有一个奇怪的列表是用以下方式建立的:

    [[name_d, 5], [name_e, 10], [name_a, 5]] 
    

    [[name_e, 10], [name_a, 5], [name_d, 5]]
    

    我试着去想一个lambda函数,我可以在sort方法中使用它,但是我不确定我能不能做到。

    4 回复  |  直到 14 年前
        1
  •  25
  •   dzimiks    5 年前

    python中的排序函数允许将函数作为排序键传递:

    l = [[name_d, 5], [name_e, 10], [name_a, 5]]
    # copy
    l_sorted = sorted(l, key=lambda x: (x[1] * -1, x[0]))
    # in place
    l.sort(key=lambda x: (x[1] * -1, x[0]))
    

    编辑:
    一。排序顺序

        2
  •  0
  •   hEADcRASH    12 年前

    这是我(为了解决同一类问题)想出的办法。我只用我最新安装的Python(OS X)版本检查过它。下面的导入部分是(笨拙地命名)排序键: sortKeyWithTwoListOrders排序键 sortKeyWith2ndThen1stListValue


    #Tested under Python 2.7.1 & Python 3.2.3:
    
    import random # Just to shuffle for demo purposes
    
    # Our two lists to sort
    firstCol=['abc','ghi','jkl','mno','bcd','hjk']
    secondCol=[5,4,2,1]
    
    # Build 2 dimensional list [[firstCol,secondCol]...]
    myList = []
    for firstInd in range(0, len(firstCol)):
      for secondInd in range(0, len(secondCol)):
        myList = myList + [[firstCol[firstInd],secondCol[secondInd]]]
    
    random.shuffle(myList)
    
    print ("myList (shuffled):")
    for i in range(0,len(myList)):
      print (myList[i])
    
    def sortKeyWithTwoListOrders(item):
      return secondCol.index(item[1]), firstCol.index(item[0])
    
    myList.sort(key=sortKeyWithTwoListOrders)
    print ("myList (sorted according to strict list order, second column then first column):")
    for i in range(0,len(myList)):
      print (myList[i])
    
    random.shuffle(myList)
    
    print ("myList (shuffled again):")
    for i in range(0,len(myList)):
      print (myList[i])
    
    def sortKeyWith2ndThen1stListValue(item):
      return item[1], item[0]
    
    myList.sort(key=sortKeyWith2ndThen1stListValue)
    print ("myList (sorted according to *values*, second column then first column):")
    for i in range(0,len(myList)):
      print (myList[i])
    

    myList (shuffled):
    ['ghi', 5]
    ['abc', 2]
    ['abc', 1]
    ['abc', 4]
    ['hjk', 5]
    ['bcd', 4]
    ['jkl', 5]
    ['jkl', 2]
    ['bcd', 1]
    ['ghi', 1]
    ['mno', 5]
    ['ghi', 2]
    ['hjk', 2]
    ['jkl', 4]
    ['mno', 4]
    ['bcd', 2]
    ['bcd', 5]
    ['ghi', 4]
    ['hjk', 4]
    ['mno', 2]
    ['abc', 5]
    ['mno', 1]
    ['hjk', 1]
    ['jkl', 1]
    myList (sorted according to strict list order, second column then first column):
    ['abc', 5]
    ['ghi', 5]
    ['jkl', 5]
    ['mno', 5]
    ['bcd', 5]
    ['hjk', 5]
    ['abc', 4]
    ['ghi', 4]
    ['jkl', 4]
    ['mno', 4]
    ['bcd', 4]
    ['hjk', 4]
    ['abc', 2]
    ['ghi', 2]
    ['jkl', 2]
    ['mno', 2]
    ['bcd', 2]
    ['hjk', 2]
    ['abc', 1]
    ['ghi', 1]
    ['jkl', 1]
    ['mno', 1]
    ['bcd', 1]
    ['hjk', 1]
    myList (shuffled again):
    ['hjk', 4]
    ['ghi', 1]
    ['abc', 5]
    ['bcd', 5]
    ['ghi', 4]
    ['mno', 1]
    ['jkl', 1]
    ['abc', 1]
    ['hjk', 1]
    ['jkl', 2]
    ['hjk', 5]
    ['mno', 2]
    ['jkl', 4]
    ['ghi', 5]
    ['bcd', 1]
    ['bcd', 2]
    ['jkl', 5]
    ['abc', 2]
    ['hjk', 2]
    ['abc', 4]
    ['mno', 4]
    ['mno', 5]
    ['bcd', 4]
    ['ghi', 2]
    myList (sorted according to *values*, second column then first column):
    ['abc', 1]
    ['bcd', 1]
    ['ghi', 1]
    ['hjk', 1]
    ['jkl', 1]
    ['mno', 1]
    ['abc', 2]
    ['bcd', 2]
    ['ghi', 2]
    ['hjk', 2]
    ['jkl', 2]
    ['mno', 2]
    ['abc', 4]
    ['bcd', 4]
    ['ghi', 4]
    ['hjk', 4]
    ['jkl', 4]
    ['mno', 4]
    ['abc', 5]
    ['bcd', 5]
    ['ghi', 5]
    ['hjk', 5]
    ['jkl', 5]
    ['mno', 5]
    
        3
  •  0
  •   Maelstrom    8 年前

    您可以对列表进行两次排序以获得结果,只需颠倒顺序:

    import operator
    
    l = [[name_d, 5], [name_e, 10], [name_a, 5]]
    
    l.sort(operator.itemgetter(1))
    l.sort(operator.itemgetter(0), reverse=True)
    

        4
  •  -2
  •   Daniel DiPaolo    14 年前

    它不需要是lambda函数 sort 方法,实际上可以提供一个真正的函数,因为它们是python中的一级对象。

    L.sort(my_comparison_function)