如何在python上对多个条件进行排序?

时间:2017-05-01 14:36:14

标签: python dictionary

6 7 5 2 12
0 2 3 6 12
2 8 5 4 13
4 3 5 7 14


 def getMinIndex(list, start, stop):
    n=len(list)
    min_index = start
    for i in range(start,stop):
        if list[i][4] > myList[min_index][4]:
            min_index = i
    return min_index

def swapElements(list,i,j):
    temp = list[i]
    list[i] = list[j]
    list[j] = temp

使用这段代码,我设法对列表中最后一个索引为4的元素进行排序,但是我对排序第一个索引有问题,因为我希望结果是这样的。

0 2 3 6 12
6 7 5 2 12
2 8 5 4 13
4 3 5 7 14

因此,如果排序后最后一个元素相同,那么我想对第一个元素进行排序。有人可以帮忙吗?谢谢:D

2 个答案:

答案 0 :(得分:1)

您可以使用operator.itemgetter并将其用于自定义排序键功能,您可以将其传递给其中一个内置排序功能:

> from operator import itemgetter
> lst = [
    [2, 8, 5, 4, 13], 
    [6, 7, 5, 2, 12], 
    [4, 3, 5, 7, 14],
    [0, 2, 3, 6, 12]
  ]
# use tuple of last and first elmnt as sorting key
> sorted(lst, key=itemgetter(-1, 0))  
  [
    [0, 2, 3, 6, 12], 
    [6, 7, 5, 2, 12], 
    [2, 8, 5, 4, 13], 
    [4, 3, 5, 7, 14]
  ]

答案 1 :(得分:1)

您要查找的是列表中项目的键功能。让我用一个例子来说明。

排序键

假设您有一个人员列表。您想按高度对它们进行排序。您不能只使用sorted对它们进行排序,因为默认情况下它们与数字的方式不具有可比性。您需要指定用于排序的密钥。关键是您要排序的特征。在这种情况下,它可能看起来像:

sorted(people, key=lambda person: person.height)

或者,如果您发现lambda符号令人困惑:

def get_height(person):
    return person.height

sorted(people, key=get_height)

排序元组

元组是一个有限的项目序列:(2,3)(2元组或对),(-3, 2, 1)(3元组),依此类推。元组按字母顺序自动排序。你不需要做任何事情。

在您的情况下,特别之处在于您不希望按第一个元素排序,然后按第二个元素排序,依此类推。您希望按第四个排序,然后按第一个排序。

这是键进入场景的地方。

将所有内容捆绑在一起

您需要一个将(a, b, c, d, e)转换为(e, a)的关键功能,这意味着:首先按第五列排序,然后按第一列排序:

def sorting_key(item):
    return (item[4], item[0])

然后你可以打电话:

sorted(items, key=sorting_key)
# or with a lambda
sorted(items, key=lambda item: (item[4], item[0]))

获取与最小值

对应的索引

我注意到你的函数返回了与元素对应的最小值。您可以对整个事物进行排序并采用第一个元素。或者,您可以使用内置的min函数并为其提供排序键。

您唯一需要考虑的是min会返回相应的,而不是索引。您可以通过以下方式解决此问题:

min_index, min_value = min(enumerate(items), key=lambda (index, value): (value[4], value[0]))

enumerate对列出具有索引的项目,因此[a, b, c]变为[(0, a), (1, b), (2, c)]。然后对这些对进行排序,就好像索引不存在一样:key接受index作为元组中的第一个参数,但完全忽略它