Выборочная сортировка списка с 3 условиями - PullRequest
0 голосов
/ 15 октября 2018
my_list = [[12, 17], [15, 11], [12, 11], [15, 17], [13, 7], [8, 11]
sorted_list = [[12, 17], [15, 17], [15, 11], [12, 11], [8, 11], [13, 7]]

Я хочу отсортировать этот список так, чтобы второе число в подсписке было упорядочено от наибольшего к наименьшему, а затем, после этого, любые числа с одинаковым вторым номером отсортированы по номерам ближе к номерам 13,5 сначала и еще дальшеот них последние.Затем, если 2 числа имеют одинаковое второе число и одинаково далеки от 13,5, выберите тот, который меньше 13,5, если предыдущий был больше 13,5, и наоборот, первая пара должна начинаться ниже 13,5. Я надеюсь, что это не слишкомсбивает с толку, так что я собираюсь перефразировать, что

-

Допустим, подсписок имеет значение [x, y]

Первым приоритетом является сортировка их по величине наименьшим по yfirst

Вторым приоритетом является их сортировка по x, наиболее удаленному от 13,5. first

Третьим приоритетом является чередование между значениями ниже и выше 13,5.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете использовать itertools.cycle, чтобы переключаться между выбором числа выше 13,5 и одного ниже 13,5, когда они одинаково далеко от 13,5:

from itertools import cycle
c = cycle((1, -1))
print(sorted(l, key=lambda t: (-t[1], abs(t[0] - 13.5), next(c) * (13.5 - t[0]) > 0)))

Это выводит:

[[12, 17], [15, 17], [15, 11], [12, 11], [8, 11], [13, 7]]
0 голосов
/ 15 октября 2018

Я использовал этот вопрос в качестве упражнения.Мой код работает, но это не красиво.Я надеюсь узнать, как улучшить это.Большое спасибо.

# sorted_list = [[12, 17], [15, 17], [15, 11], [12, 11], [8, 11], [13, 7]]

import numpy as np
import pandas as pd
listA = [[12, 17], [15, 11], [12, 11], [15, 17], [13, 7], [8, 11]]
listA = dict(zip([i for i in range(len(listA))], listA))
df = pd.DataFrame(listA).T
df.columns = ['A', 'B']
df['C'] = np.abs(df['A'] - 13.5)
df.sort_values(by=['B', 'C'], ascending=[False, True], inplace=True)
df.drop('C', axis=1, inplace=True)
df.index = [i for i in range(len(df.index))]
sorted_list = []
for i in range(len(df.index)):
    temp_list = []
    for j in range(len(df.columns)):
        temp_list.append(df.iloc[i, j])
    sorted_list.append(temp_list)
print('sorted_list = ', sorted_list)

sorted_list = [[12, 17], [15, 17], [15, 11], [12, 11], [8, 11],[13, 7]]

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