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
答案 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
作为元组中的第一个参数,但完全忽略它。