【问题标题】:Can anybody explain to me how this sorted work?任何人都可以向我解释这种排序是如何工作的吗?
【发布时间】:2021-10-16 00:56:39
【问题描述】:

我发现了这个 edabit 挑战 (link to challenge):

创建一个函数,该函数接受一个数字列表 lst、一个字符串 s 并按照以下规则返回一个数字列表:

"Asc" 返回一个按升序排列的列表。 "Des" 返回一个按降序排列的列表。 "None" 返回一个没有任何修改的列表。

有人 Evgeny SH 提出了这个解决方案:

def asc_des_none(lst, s):
    return sorted(lst, reverse=s == 'Des') if s else lst

你能解释一下 sorted(...) 部分的工作原理吗?提前致谢!

【问题讨论】:

  • 你知道s == 'Des' 是做什么的吗?你知道reverse=True 做什么吗?你知道reverse=False 做什么吗?将其分解为足够简单,以便我们确切地知道您在阅读时遇到了什么问题。
  • sorted 带一个reverse 参数,可以接收一个布尔值(False 或True)` 当s=='Des' 为True 时,则reverse 设置为True,排序将是下降。在其他情况下,参数值为 False,但当 sNone 时,它从不计算表达式的那部分;只有else 部分。
  • 顺便说一句,这段代码不符合规范:它不尊重None
  • 如果你输入"None"而不是None会失败,但是很有趣
  • 我不喜欢该代码中使用的格式。 reverse=(s == 'Des') 会更清楚。

标签: python sorting


【解决方案1】:
def asc_des_none(lst, s):
    return sorted(lst, reverse=s == 'Des') if s else lst

sorted 函数对可迭代对象(例如列表)进行排序并输出排序后的副本。它可以采用reverse 参数,设置为TrueFalse。 if True if 会输出降序排列的列表。

所以,如果s == "Desc",列表将按降序排列。

另一部分… if s else lst将运行s是truthy,否则将输出不变的lst。真实对象是非空数字、非空字符串,而不是 None。

我认为你的朋友想利用 None 是虚假的这一事实,但在这里我们实际上有“None”,这是行不通的。

如果“None”字符串确实应该触发没有变化,那么正确的代码应该是:

def asc_des_none(lst, s):
    return sorted(lst, reverse=s == 'Des') if s !="None" else lst

【讨论】:

    【解决方案2】:

    sorted() 返回列表的排序副本。

    函数可以写成

    def asc_des_none(lst, s):
        if s:
            if s == "Des":
                return sorted(lst, reverse=True) 
            return sorted(lst, reverse=False) 
        return lst
    

    严格来说,它并没有按照规范所说的那样做,因为如果 s 不是虚假值,它将按升序返回列表。

    要严格遵守规范,应该是这样的

    def asc_des_none(lst, s):
        if s == "Des":
            return sorted(lst, reverse=True) 
        if s == "Asc":
            return sorted(lst, reverse=False) 
        if s is None:
            return lst
        raise ValueError(f"`s` must be Asc, Des, or None; not {s!r}")
    

    或类似的。

    【讨论】:

    • @trincot True(尽管在这种情况下并不重要)。还是修好了。
    • 感谢您的回复。我现在明白了。你的回答对我非常有用。
    【解决方案3】:

    目标是生成一个布尔值,指示列表是否应该反向排序(s == 'Des' 时)或不(s != 'Des' 时),或者是否根本不应该对列表进行排序。

    我会更严格地处理s 的处理方式。我将允许三个可能的值:任何其他值都会产生 ValueError

    def asc_des_none(lst, s):
        if s is None:
            return lst
    
        try:
            rev = {'Asc': False, 'Des': True}[s]
        except KeyError:
            raise ValueError(f"Unrecognized sorting direction '{s}'")
    
        return sorted(lst, reverse=rev)
    

    【讨论】:

      【解决方案4】:

      排序函数的语法是

      sorted(iterable, key=None, reverse=False)

      iterable 是我们的第一个。另一个默认为 False 的参数 reverse 按升序对第一个进行排序,但如果 reverse 的值为 True,我们的 sorted 函数将按降序对第一个进行排序,在 reverse=s == 'Des', s如果 s 的值为 Des,则 == 'Des' 计算结果为 true,而 Des 又按降序对我们的 lst 进行排序。

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 2021-10-23
        • 1970-01-01
        相关资源
        最近更新 更多