Сортировать список в Python с ключевым аргументом - PullRequest
0 голосов
/ 12 октября 2019

Я хотел бы отсортировать список элементов в соответствии с этим утверждением:

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

как бы мне нужно заявить об этом в Python 3 с помощью функции sort ()?

Я понял, что могу просто использовать ключевой аргумент и создать такую ​​функцию, как:

   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)

Но я не знаю, каким будет аргумент для функции сортировщика? А возврат функции?

Спасибо: -)

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Полный пример для моего комментария

list.sort(reverse=True, key = lambda x: (x.rank, x.distance)) должно работать - если последовательный x.rank равен, он будет сортировать по возрастанию по возрастанию - проблема в том, что: расстояние до чего ... вы не можетеделать относительные расстояния между точками - больше похоже на общее расстояние каждой точки по отношению к центру (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]
1 голос
/ 12 октября 2019

Вы можете передать в качестве аргумента key :

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

Это сработает, потому что для сравнения кортежей используется лексикографический порядок. Таким образом, если ранги неравны, это будет определять порядок, и если они будут равны, расстояния определяют порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...