【问题标题】:Custom sort a list with 3 conditions自定义排序具有 3 个条件的列表
【发布时间】:2019-03-19 09:28:37
【问题描述】:
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 优先对它们进行从大到小排序

第二个优先级是按距离 13.5 最远的x 对它们进行排序

第三个优先级是在低于和高于 13.5 之间交替。

【问题讨论】:

  • 你尝试了什么?

标签: python arrays list sorting


【解决方案1】:

您可以使用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]]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多