【问题标题】:Does anyone know what two brackets next to each other does in python (ex: [][],[][])有谁知道python中两个相邻的括号是做什么的(例如:[][],[][])
【发布时间】:2022-01-25 15:23:16
【问题描述】:

我正在研究递归算法并且需要一些帮助,所以我来到这里进行了一些挖掘。我发现的东西适用于我想要它做的事情(链接:python minmax using only recursion),但我不明白它为什么以及如何工作。代码如下:

def minMax(A,n):
if A:
    header = A[0]
    tailend = A[1:]

    if tailend != []:
        minimum, maximum = minMax(tailend,n-1)
        return [header, minimum][minimum < header], [header, maximum][maximum > header]

    return header, header
return A

intlist = [30, 50, 20, 70, 10, 80, 25, 100, 60, 40]
print(minMax(intlist,len(intlist)))

我不明白的是这一段:return [header, minimum][minimum header] 括号是如何工作的?据我所知,括号用于切片、列表、索引和排序。但是在这里,似乎有某种关键字在幕后进行,我就是想不通。任何帮助将不胜感激。

【问题讨论】:

  • 第一个括号定义了一个包含两个项目的列表,第二个括号是一个布尔值的项目访问,它的值为 0 代表 False 或 1 代表 True。
  • 另外:返回列表之间用逗号将它们作为元组返回。
  • if minimum &lt; header: return minimum else: return header 的写法既愚蠢又令人困惑(第一部分仅在逗号之前,当然在逗号之后类似)。
  • @9769953 我是一名业余程序员,我总是想知道那些“愚蠢的”编写代码的方法是否只是对加快代码速度、节省内存等有用的东西......
  • @JoséChamorro 有时,他们可能是。在这里,它们可能是一种快捷方式,而不必编写 if-else 语句。但是,当然对于 Python,我认为尝试以这种迟钝的方式尝试加速代码或节省内存是非常无益的(对于确实重要的语言,可能有更好的构造来实现这一点,或者编译器/解释器会比程序员聪明)。

标签: python


【解决方案1】:

您有一个列表 [] 正在被订阅 [1,2,3][0]

如果您运行 minimun &lt; header 并且 minumunheader 都已明确定义,则输出将是布尔值 TrueFalse

现在,在 Python 中:

0=False
1=True

原来如此。

因此,您将获得列表中的元素 0 或 1。

正如@csjh 所指出的,您的“返回”会将一系列以逗号分隔且没有进一步说明的值解释为元组。

因此,您将获得每个列表的元素 0 或 1,并且您将获得该信息作为 len 2 的元组:

(element_1,element_2)

【讨论】:

    【解决方案2】:

    不是一种解释,而是一种更 Python(但仍然很迟钝)的方式来将其编写为单行代码:

    return header if minimum > header else minimum, header if maximum < header else maximum
    

    它使用 Python 的三元 if-else 表达式的变体。

    更明确地说,你可以简单地写

    if minimum > header:
        a = header
    else:
        a = minimum
    
    if maximum < header:
        b = header
    else:
        b = maximum
    
    return (a, b)
    

    或者用三元表达式:

    a = header if minimum > header else minimum
    b = header if maximum < header else maximum
    return (a, b)
    

    在我看来,这使代码保持了合理的简短,同时仍然比原始代码清晰得多。


    当然,上面的说法全都错了,但可能更接近原始陈述。这是你(真正)应该做的:

    return min(minimum, header), max(maximum, header)
    

    它显示了实际意图,并且比任何其他书写方式都要短得多。 (可能会忽略练习的实际目的,所以有点断章取义。)

    【讨论】:

      【解决方案3】:

      [minimum &lt; header] 是列表的索引。由于索引应该是整数,[minimum &lt; header] 被强制转换为整数。 False 转到 0True 转到 1。因此,如果minimum 小于header,则返回minimum,因为它是索引1 处的元素。否则,header 将被返回。这是获取min([header, minimum]) 的一种奇特方式。我不确定写这篇文章的人是在炫耀还是忘记min

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 2017-12-29
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        相关资源
        最近更新 更多