海象表达式
刷力扣提突然刷到一个答案
原题如下:
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
著作权归LeetCode网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答方案:
if k := (k % len(nums)):
nums[:k], nums[k:] = nums[-k:], nums[:-k]
if语句中 := ,叫做海象表达式
ps:这是3.8 新特性网址:https://docs.python.org/3/whatsnew/3.8.html
官方示例1
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
传统写法1
if len(a) > 10:
print(f"List is to long({len(a)} elements, expected <= 10)")
传统写法2
n = len(a)
if n > 10:
print(f"List is to long({n} elements, expected <= 10)")
先将len(a)赋值给n,再判断n > 10,然后把值赋给n,相对传统写法1可以少调用一次len(a)。相对传统写法2可以简化代码。
官方示例2
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
与官方示例1作用基本一致
官方示例3
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
传统写法:
while True:
block = f.read(256)
if block != '':
process(block)
else:
break
先将f.read(256)赋值给block,在判定block值,让代码更整洁。
官方示例4
[clean_name.title() for name in names if (clean_name := normalize('NFC', name)) in allowed_names]
将上一句中方法做替换
[x.title() for y in list if (x := f(y))]
传统写法
[f(y).title() for y in list if f(y)]
这样可以避免调用两次 f(y)
回到原题中,分为以下三种情况:
k 小于 nums 长度,且 k 不为 0 时,直接将 nums 中前 k 个和后 k 个互换即可。
k = 0 或 k 为 nums 长度的整数倍时,不变,输出 nums。
k > len(nums),k对 len(nums) 取余,再重复 k 小于 nums 长度步骤即可。
传统写法:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if (k % len(nums)):
k = k % len(nums)
nums[:k], nums[k:] = nums[-k:], nums[:-k]
return nums
使用海象表达式写法:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if k := (k % len(nums)):
nums[:k], nums[k:] = nums[-k:], nums[:-k]
return nums