【问题标题】:Python - Sorting ListsPython - 排序列表
【发布时间】:2015-01-06 01:38:50
【问题描述】:

我正在尝试使用此代码按多个条件对列表进行排序。

lis = sorted([lsDataSorted[i:i+8] for i in range(0,len(lsDataSorted),8)],key=lambda x:(x[7],int(x[5])-int(x[6]),x[5],x[0]),reverse=True)

现在,我们不必费心谈论每个对象是什么,但我们看到我有一个“反向”排序功能。现在,我的最后一个条件x[0] 恰好是一个名字列表。通过使用reverse=True,我们知道排序将以相反的顺序(z-a)。我的问题是,我可以仅在最后一种情况下“逆转”恢复正常吗?如果是,那么如何?

【问题讨论】:

  • This answer 应该可以帮到你。
  • 查看this question 及其答案。
  • 好吧,换句话说,用同样的 lambda 东西写一个新行更好,但最后一个条件?
  • 什么是lsDataSorted?有什么例子吗?
  • 它是一个列表 ls = ["name1","a1","b1","c1",..."h1","name2","a2","b2"," c2"...] 等等。我想按某些条件对 8 个不同的“类别”进行排序。它实际上最终将是一个表格,我根据一些值和最后的对象名称进行排序

标签: python list sorting


【解决方案1】:

我建议将lsDataSorted 的每个块包装到一个自定义类中,该类将根据您的复杂条件强制进行比较。例如:

import functools

@functools.total_ordering
class Compare(object):
    def __init__(self, chunk):
        self.x = chunk[7], int(chunk[5]) - int(chunk[6]), chunk[5]
        self.y = chunk[0]
    def __eq__(self, other):
        return (self.x==other.x) and (self.y==other.y)
    def __lt__(self, other):
        if self.x != other.x:
            return self.x < other.x
        return self.y > other.y

现在,

lis = sorted([lsDataSorted[i:i+8]
              for i in range(0,len(lsDataSorted),8)],
              key=Compare, reverse=True)

应该为您提供您显然正在寻找的混合复杂排序。

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2019-11-29
    相关资源
    最近更新 更多