在处理一个简单的编码问题,编写函数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]]
最后一行是什么意思?
答案 0 :(得分:9)
最后一行是写if then else
表达式的晦涩方式。
[0, size-1]
创建两个元素的列表。nums[0] < nums[size-1]
返回True
或False
True/False
被隐式转换为1
或0
。size-1
或0
。一种更清晰的书写方式是:
return size - 1 if nums[0] < nums[size - 1] else 0
答案 1 :(得分:5)
第一组方括号构成一个列表,第二组方括号索引该列表。
[0,size-1][nums[0]<nums[size-1]]
^^^^^^^^^^
# constructs a list
[0,size-1][nums[0]<nums[size-1]]
^^^^^^^^^^^^^^^^^^^^^^
# indexes the list
例如,假设nums = [1, 2, 3, 4]
。然后size = 4
。构造好的列表将是
[0, size-1] == [0, 3]
鉴于上面的列表nums
,第二组括号的计算结果为
nums[0] < nums[size-1] == 1 < 4
== True
...这将为列表编制索引
[0, size-1][True] == size-1
在某些圈子中,它是一种模拟高尔夫if语句的代码搜寻技术。简而言之,它大约等同于
if nums[0] < nums[size - 1]:
return size - 1
else:
return 0
这仅等效于 ,因为在构造列表时会同时评估标记0
和size-1
。但是它们不带有if语句。
例如:
print([0, 1/0][0])
将在程序到达该行时引发错误。但是...
if 0:
print(1/0)
else:
print(0)
仅当程序执行print(1/0)
时,以上内容才会引发错误。