了解Python中的return [0,size-1] [nums [0] <nums [size-1]]

Glo*_*utd 6 python list

在处理一个简单的编码问题,编写函数时findPeakElement,我遇到了以下代码:

def findPeakElement(self, nums):
     size = len(nums)
     for x in range(1,size-1):
         if nums[x] > nums[x-1] and nums[x] > nums[x+1]:
            return x

     return [0,size-1][nums[0]<nums[size-1]]
Run Code Online (Sandbox Code Playgroud)

最后一行是什么意思?

Rol*_*lig 9

最后一行是写if then else表达式的晦涩方式。

  • [0, size-1] 创建两个元素的列表。
  • nums[0] < nums[size-1]返回TrueFalse
  • 当用作列表索引时,它True/False隐式转换为10
  • 然后从列表中选择size-10

一种更清晰的书写方式是:

return size - 1 if nums[0] < nums[size - 1] else 0
Run Code Online (Sandbox Code Playgroud)


Tre*_*edJ 5

第一组方括号构造一个列表,第二组方括号索引该列表。

[0,size-1][nums[0]<nums[size-1]]
^^^^^^^^^^
# constructs a list

[0,size-1][nums[0]<nums[size-1]]
          ^^^^^^^^^^^^^^^^^^^^^^
          # indexes the list
Run Code Online (Sandbox Code Playgroud)

例如,假设nums = [1, 2, 3, 4]。然后size = 4。构造的列表将是

[0, size-1] == [0, 3]
Run Code Online (Sandbox Code Playgroud)

根据上述清单nums,第二组括号的计算结果为

nums[0] < nums[size-1]    ==    1 < 4
                          ==    True
Run Code Online (Sandbox Code Playgroud)

...反过来将为列表编制索引

[0, size-1][True]    ==    size-1
Run Code Online (Sandbox Code Playgroud)

在某些圈子中,它是一种模拟if语句的代码查询技术。简而言之,它大约等于

if nums[0] < nums[size - 1]:
    return size - 1
else:
    return 0
Run Code Online (Sandbox Code Playgroud)

它仅近似相等,因为两个令牌0size-1都在构造列表时进行评估。但是它们不具有if语句。

例如:

print([0, 1/0][0])
Run Code Online (Sandbox Code Playgroud)

程序到达该行时将引发错误。然而...

if 0:
    print(1/0)
else:
    print(0)
Run Code Online (Sandbox Code Playgroud)

如果程序执行,以上内容只会引发错误print(1/0)