按多个非标准条件对列表进行排序
Sorting a list by multiple non-standard criteria
我正在尝试在我的程序中设置某种数据结构,以从 excel 文件中获取数据。它需要按以下标准排序:
- 按索引 5 升序
- 如果两个结构的索引 5 的值相同,则将索引 0 = 8 的结构放在最前面。
目前,我已经能够通过索引 5 的升序排序来转换这个:
[8, 8, 8, 8, 0, 250]
[8, 8, 8, 0, 0, 50]
[8, 8, 0, 0, 0, 5]
[1, 1, 1, 1, 1, 50]
[1, 1, 1, 1, 0, 25]
[1, 1, 1, 0, 0, 4]
[2, 2, 2, 2, 2, 60]
[2, 2, 2, 2, 0, 30]
[2, 2, 2, 0, 0, 5]
[3, 3, 3, 3, 3, 70]
[3, 3, 3, 3, 0, 35]
[3, 3, 3, 0, 0, 8]
[4, 4, 4, 4, 4, 80]
[4, 4, 4, 4, 0, 40]
[4, 4, 4, 0, 0, 10]
[5, 5, 5, 5, 5, 90]
[5, 5, 5, 5, 0, 45]
[5, 5, 5, 0, 0, 12]
[6, 6, 6, 6, 6, 100]
[6, 6, 6, 6, 0, 50]
[6, 6, 6, 0, 0, 15]
[9, 9, 9, 9, 9, 120]
[9, 9, 9, 9, 0, 60]
[9, 9, 9, 0, 0, 20]
[9, 9, 0, 0, 0, 2]
[10, 10, 10, 10, 10, 150]
[10, 10, 10, 10, 0, 75]
[10, 10, 10, 0, 0, 25]
[10, 10, 0, 0, 0, 3]
[11, 11, 11, 11, 11, 400]
[11, 11, 11, 11, 0, 150]
[11, 11, 11, 0, 0, 40]
[11, 11, 0, 0, 0, 3]
进入这个
[11, 11, 11, 11, 11, 400]
[8, 8, 8, 8, 0, 250]
[11, 11, 11, 11, 0, 150]
[10, 10, 10, 10, 10, 150]
[9, 9, 9, 9, 9, 120]
[6, 6, 6, 6, 6, 100]
[5, 5, 5, 5, 5, 90]
[4, 4, 4, 4, 4, 80]
[10, 10, 10, 10, 0, 75]
[3, 3, 3, 3, 3, 70]
[9, 9, 9, 9, 0, 60]
[2, 2, 2, 2, 2, 60]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
[5, 5, 5, 5, 0, 45]
[11, 11, 11, 0, 0, 40]
[4, 4, 4, 4, 0, 40]
[3, 3, 3, 3, 0, 35]
[2, 2, 2, 2, 0, 30]
[10, 10, 10, 0, 0, 25]
[1, 1, 1, 1, 0, 25]
[9, 9, 9, 0, 0, 20]
[6, 6, 6, 0, 0, 15]
[5, 5, 5, 0, 0, 12]
[4, 4, 4, 0, 0, 10]
[3, 3, 3, 0, 0, 8]
[2, 2, 2, 0, 0, 5]
[8, 8, 0, 0, 0, 5]
[1, 1, 1, 0, 0, 4]
[11, 11, 0, 0, 0, 3]
[10, 10, 0, 0, 0, 3]
[9, 9, 0, 0, 0, 2]
这使用了 .sort(key = lambda x:x[5])
和 .reverse()
函数。
但是,特别提请注意一个部分。
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
我希望索引 0 处带有 8 的所有内容列在第一个,所以这应该是
[8, 8, 8, 0, 0, 50]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
我知道在这种特定情况下,这可以通过对索引 0 进行二次排序来获得所需结果来实现。但是,在某些情况下,我们可能会有不同的输入,比如
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
[11, 11, 0, 0, 0, 50]
需要排序到
[8, 8, 8, 0, 0, 50]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[11, 11, 0, 0, 0, 50]
所以对次要变量进行排序是行不通的。我可以从哪里开始寻找这个特定问题的解决方案?
试试这个:
l = [[8, 8, 8, 8, 0, 250], [8, 8, 8, 0, 0, 50], [8, 8, 0, 0, 0, 5], [1, 1, 1, 1, 1, 50], [1, 1, 1, 1, 0, 25], [1, 1, 1, 0, 0, 4], [2, 2, 2, 2, 2, 60], [2, 2, 2, 2, 0, 30], [2, 2, 2, 0, 0, 5], [3, 3, 3, 3, 3, 70], [3, 3, 3, 3, 0, 35], [3, 3, 3, 0, 0, 8], [4, 4, 4, 4, 4, 80], [4, 4, 4, 4, 0, 40], [4, 4, 4, 0, 0, 10], [5, 5, 5, 5, 5, 90], [5, 5, 5, 5, 0, 45], [5, 5, 5, 0, 0, 12], [6, 6, 6, 6, 6, 100], [6, 6, 6, 6, 0, 50], [6, 6, 6, 0, 0, 15], [9, 9, 9, 9, 9, 120], [9, 9, 9, 9, 0, 60], [9, 9, 9, 0, 0, 20], [9, 9, 0, 0, 0, 2], [10, 10, 10, 10, 10, 150], [10, 10, 10, 10, 0, 75], [10, 10, 10, 0, 0, 25], [10, 10, 0, 0, 0, 3], [11, 11, 11, 11, 11, 400], [11, 11, 11, 11, 0, 150], [11, 11, 11, 0, 0, 40], [11, 11, 0, 0, 0, 3], [11, 11, 0, 0, 0, 50]]
ls = sorted(l, key = lambda x: [x[5], x[0]==8], reverse = True)
输出为:
[[11, 11, 11, 11, 11, 400], [8, 8, 8, 8, 0, 250], [10, 10, 10, 10, 10, 150], [11, 11, 11, 11, 0, 150], [9, 9, 9, 9, 9, 120], [6, 6, 6, 6, 6, 100], [5, 5, 5, 5, 5, 90], [4, 4, 4, 4, 4, 80], [10, 10, 10, 10, 0, 75], [3, 3, 3, 3, 3, 70], [2, 2, 2, 2, 2, 60], [9, 9, 9, 9, 0, 60], [8, 8, 8, 0, 0, 50], [1, 1, 1, 1, 1, 50], [6, 6, 6, 6, 0, 50], [11, 11, 0, 0, 0, 50], [5, 5, 5, 5, 0, 45], [4, 4, 4, 4, 0, 40], [11, 11, 11, 0, 0, 40], [3, 3, 3, 3, 0, 35], [2, 2, 2, 2, 0, 30], [1, 1, 1, 1, 0, 25], [10, 10, 10, 0, 0, 25], [9, 9, 9, 0, 0, 20], [6, 6, 6, 0, 0, 15], [5, 5, 5, 0, 0, 12], [4, 4, 4, 0, 0, 10], [3, 3, 3, 0, 0, 8], [8, 8, 0, 0, 0, 5], [2, 2, 2, 0, 0, 5], [1, 1, 1, 0, 0, 4], [10, 10, 0, 0, 0, 3], [11, 11, 0, 0, 0, 3], [9, 9, 0, 0, 0, 2]]
它根据列表的第五项作为第一优先级进行排序,如果它们相等,则检查第二优先级 - 列表的第一项是否为 8(首先将 8 的列表放在第一个索引,然后其余按第一项的排序顺序)如:
[8, 8, 8, 0, 0, 50],
[1, 1, 1, 1, 1, 50],
[6, 6, 6, 6, 0, 50],
[11, 11, 0, 0, 0, 50],
如果你使用data.sort(key = lambda x:x[0] == 8),那么它将对位置0上的8到最后一位进行排序。所以你可以做的是:
先排序,所以0位置的8都排在最后:
data.sort(key = lambda x:x[0] == 8)
然后按照第5位排序:
data.sort(key = lambda x:x[5])
然后倒序:
data.reverse()
我正在尝试在我的程序中设置某种数据结构,以从 excel 文件中获取数据。它需要按以下标准排序:
- 按索引 5 升序
- 如果两个结构的索引 5 的值相同,则将索引 0 = 8 的结构放在最前面。
目前,我已经能够通过索引 5 的升序排序来转换这个:
[8, 8, 8, 8, 0, 250]
[8, 8, 8, 0, 0, 50]
[8, 8, 0, 0, 0, 5]
[1, 1, 1, 1, 1, 50]
[1, 1, 1, 1, 0, 25]
[1, 1, 1, 0, 0, 4]
[2, 2, 2, 2, 2, 60]
[2, 2, 2, 2, 0, 30]
[2, 2, 2, 0, 0, 5]
[3, 3, 3, 3, 3, 70]
[3, 3, 3, 3, 0, 35]
[3, 3, 3, 0, 0, 8]
[4, 4, 4, 4, 4, 80]
[4, 4, 4, 4, 0, 40]
[4, 4, 4, 0, 0, 10]
[5, 5, 5, 5, 5, 90]
[5, 5, 5, 5, 0, 45]
[5, 5, 5, 0, 0, 12]
[6, 6, 6, 6, 6, 100]
[6, 6, 6, 6, 0, 50]
[6, 6, 6, 0, 0, 15]
[9, 9, 9, 9, 9, 120]
[9, 9, 9, 9, 0, 60]
[9, 9, 9, 0, 0, 20]
[9, 9, 0, 0, 0, 2]
[10, 10, 10, 10, 10, 150]
[10, 10, 10, 10, 0, 75]
[10, 10, 10, 0, 0, 25]
[10, 10, 0, 0, 0, 3]
[11, 11, 11, 11, 11, 400]
[11, 11, 11, 11, 0, 150]
[11, 11, 11, 0, 0, 40]
[11, 11, 0, 0, 0, 3]
进入这个
[11, 11, 11, 11, 11, 400]
[8, 8, 8, 8, 0, 250]
[11, 11, 11, 11, 0, 150]
[10, 10, 10, 10, 10, 150]
[9, 9, 9, 9, 9, 120]
[6, 6, 6, 6, 6, 100]
[5, 5, 5, 5, 5, 90]
[4, 4, 4, 4, 4, 80]
[10, 10, 10, 10, 0, 75]
[3, 3, 3, 3, 3, 70]
[9, 9, 9, 9, 0, 60]
[2, 2, 2, 2, 2, 60]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
[5, 5, 5, 5, 0, 45]
[11, 11, 11, 0, 0, 40]
[4, 4, 4, 4, 0, 40]
[3, 3, 3, 3, 0, 35]
[2, 2, 2, 2, 0, 30]
[10, 10, 10, 0, 0, 25]
[1, 1, 1, 1, 0, 25]
[9, 9, 9, 0, 0, 20]
[6, 6, 6, 0, 0, 15]
[5, 5, 5, 0, 0, 12]
[4, 4, 4, 0, 0, 10]
[3, 3, 3, 0, 0, 8]
[2, 2, 2, 0, 0, 5]
[8, 8, 0, 0, 0, 5]
[1, 1, 1, 0, 0, 4]
[11, 11, 0, 0, 0, 3]
[10, 10, 0, 0, 0, 3]
[9, 9, 0, 0, 0, 2]
这使用了 .sort(key = lambda x:x[5])
和 .reverse()
函数。
但是,特别提请注意一个部分。
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
我希望索引 0 处带有 8 的所有内容列在第一个,所以这应该是
[8, 8, 8, 0, 0, 50]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
我知道在这种特定情况下,这可以通过对索引 0 进行二次排序来获得所需结果来实现。但是,在某些情况下,我们可能会有不同的输入,比如
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[8, 8, 8, 0, 0, 50]
[11, 11, 0, 0, 0, 50]
需要排序到
[8, 8, 8, 0, 0, 50]
[6, 6, 6, 6, 0, 50]
[1, 1, 1, 1, 1, 50]
[11, 11, 0, 0, 0, 50]
所以对次要变量进行排序是行不通的。我可以从哪里开始寻找这个特定问题的解决方案?
试试这个:
l = [[8, 8, 8, 8, 0, 250], [8, 8, 8, 0, 0, 50], [8, 8, 0, 0, 0, 5], [1, 1, 1, 1, 1, 50], [1, 1, 1, 1, 0, 25], [1, 1, 1, 0, 0, 4], [2, 2, 2, 2, 2, 60], [2, 2, 2, 2, 0, 30], [2, 2, 2, 0, 0, 5], [3, 3, 3, 3, 3, 70], [3, 3, 3, 3, 0, 35], [3, 3, 3, 0, 0, 8], [4, 4, 4, 4, 4, 80], [4, 4, 4, 4, 0, 40], [4, 4, 4, 0, 0, 10], [5, 5, 5, 5, 5, 90], [5, 5, 5, 5, 0, 45], [5, 5, 5, 0, 0, 12], [6, 6, 6, 6, 6, 100], [6, 6, 6, 6, 0, 50], [6, 6, 6, 0, 0, 15], [9, 9, 9, 9, 9, 120], [9, 9, 9, 9, 0, 60], [9, 9, 9, 0, 0, 20], [9, 9, 0, 0, 0, 2], [10, 10, 10, 10, 10, 150], [10, 10, 10, 10, 0, 75], [10, 10, 10, 0, 0, 25], [10, 10, 0, 0, 0, 3], [11, 11, 11, 11, 11, 400], [11, 11, 11, 11, 0, 150], [11, 11, 11, 0, 0, 40], [11, 11, 0, 0, 0, 3], [11, 11, 0, 0, 0, 50]]
ls = sorted(l, key = lambda x: [x[5], x[0]==8], reverse = True)
输出为:
[[11, 11, 11, 11, 11, 400], [8, 8, 8, 8, 0, 250], [10, 10, 10, 10, 10, 150], [11, 11, 11, 11, 0, 150], [9, 9, 9, 9, 9, 120], [6, 6, 6, 6, 6, 100], [5, 5, 5, 5, 5, 90], [4, 4, 4, 4, 4, 80], [10, 10, 10, 10, 0, 75], [3, 3, 3, 3, 3, 70], [2, 2, 2, 2, 2, 60], [9, 9, 9, 9, 0, 60], [8, 8, 8, 0, 0, 50], [1, 1, 1, 1, 1, 50], [6, 6, 6, 6, 0, 50], [11, 11, 0, 0, 0, 50], [5, 5, 5, 5, 0, 45], [4, 4, 4, 4, 0, 40], [11, 11, 11, 0, 0, 40], [3, 3, 3, 3, 0, 35], [2, 2, 2, 2, 0, 30], [1, 1, 1, 1, 0, 25], [10, 10, 10, 0, 0, 25], [9, 9, 9, 0, 0, 20], [6, 6, 6, 0, 0, 15], [5, 5, 5, 0, 0, 12], [4, 4, 4, 0, 0, 10], [3, 3, 3, 0, 0, 8], [8, 8, 0, 0, 0, 5], [2, 2, 2, 0, 0, 5], [1, 1, 1, 0, 0, 4], [10, 10, 0, 0, 0, 3], [11, 11, 0, 0, 0, 3], [9, 9, 0, 0, 0, 2]]
它根据列表的第五项作为第一优先级进行排序,如果它们相等,则检查第二优先级 - 列表的第一项是否为 8(首先将 8 的列表放在第一个索引,然后其余按第一项的排序顺序)如:
[8, 8, 8, 0, 0, 50],
[1, 1, 1, 1, 1, 50],
[6, 6, 6, 6, 0, 50],
[11, 11, 0, 0, 0, 50],
如果你使用data.sort(key = lambda x:x[0] == 8),那么它将对位置0上的8到最后一位进行排序。所以你可以做的是:
先排序,所以0位置的8都排在最后:
data.sort(key = lambda x:x[0] == 8)
然后按照第5位排序:
data.sort(key = lambda x:x[5])
然后倒序:
data.reverse()