自定义对3个条件的列表进行排序

时间:2018-10-15 01:03:09

标签: python arrays list sorting

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的数字排序,然后再远离它们的数字排序最后。然后,如果两个数字具有相同的第二个数字,并且距离13.5的距离相等,如果前一个数字大于13.5,则选择小于13.5的数字,反之亦然,则第一对数字应从13.5以下开始 我希望这不会太令人困惑,所以我要重新措辞

-

假设子列表为[x, y]

首要任务是按照y的先后顺序将它们从大到小排序

第二优先级是按照距离x最远的def check_for_overlap(): rectangle_a = {"x1":15, "y1":10, "x2":10,"y2":5} rectangle_b = {"x1": 25, "y1":10, "x2":20,"y2":5} #black color or red color if(rectangle_a["y1"]<rectangle_b["y2"] or rectangle_a["x1"]<rectangle_b["x2"]): print("no overlap ") #the blue color or green elif(rectangle_a["x2"]>rectangle_b["x1"] or rectangle_a["y2"]>rectangle_b["y1"]): print("no overlap ") else: print("YES ! there is a overlap") check_for_overlap() 进行排序

第三优先级是在小于和大于13.5之间交替。

2 个答案:

答案 0 :(得分:3)

您可以使用itertools.cycle在距离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]]

答案 1 :(得分:1)

我用这个问题作为练习。我的代码有效,但效果不佳。我希望学习如何改进它。非常感谢。

# 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]]