Py学习  »  Python

使用键参数对python中的列表排序

Steven • 4 年前 • 889 次点击  

我想根据以下语句对元素列表进行排序:

i>=j  if(i_rank < j_rank OR ((i_rank == j_rank) AND (i_dinstance > j_dinstance)))

我需要如何在python 3中使用sort()函数来声明这一点?

我知道我可以使用key参数,然后创建一个如下的函数:

   def sorter(x):
    if(i.rank < j.rank or ((i.rank == j.rank) and (i.distance > j.distance))):
        return ??
    else: 
        return ??

list.sort(reverse=True, key = sorter)

但我不知道sorter函数的参数是什么?函数的返回呢?

谢谢:-)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46862
 
889 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Patrick Artner
Reply   •   1 楼
Patrick Artner    4 年前

我的评论的完整例子

list.sort(reverse=True, key = lambda x: (x.rank, x.distance)) 应该有效-如果连续的x.rank相等,它将按距离升序排序-问题是:距离到什么…你不能做点之间的相对距离-更像是每个点到f.e.中心的总距离(0,0)[即一个预先计算的距离…]

class p:
    def __init__(self, r, d):
        self.rank = r
        self.distance = d
    def __str__(self):
        return f'{self.rank}|{self.distance}'
    def __repr__(self):
        return str(self)

ranks = [1,2,3]
distances = [10,30,10]

data = [p(r,d) for r in ranks for d in distances]

print(data)

# sort by max rank, min distance
data.sort(key=lambda x:(-x.rank, x.distance))

print(data)

输出:

# created data
[1|10, 1|30, 1|10, 2|10, 2|30, 2|10, 3|10, 3|30, 3|10]

# sorted by max rank, min distance
[3|10, 3|10, 3|30, 2|10, 2|10, 2|30, 1|10, 1|10, 1|30]
Ami Tavory
Reply   •   2 楼
Ami Tavory    4 年前

你可以通过 key argument 以下内容:

key=lambda x: (-x.rank, x.distance)

这是可行的,因为比较元组使用字典排序。因此,如果秩是不相等的,这将决定次序;如果秩是相等的,则距离决定次序。