在处理一个简单的编码问题,编写函数时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)
最后一行是什么意思?
最后一行是写if then else表达式的晦涩方式。
[0, size-1] 创建两个元素的列表。nums[0] < nums[size-1]返回True或FalseTrue/False隐式转换为1或0。size-1或0。一种更清晰的书写方式是:
return size - 1 if nums[0] < nums[size - 1] else 0
Run Code Online (Sandbox Code Playgroud)
第一组方括号构造一个列表,第二组方括号索引该列表。
[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)
它仅近似相等,因为两个令牌0和size-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)。