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之间交替。
答案 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]]