Python 数组切片未按预期工作
Python array slice not working as expected
我正在尝试为给定数组和值编写一个程序,以删除该值的所有实例和 return 新长度。
示例:
给定输入数组 nums = [3,2,2,3], val = 3
应该returnlength = 2,nums的前两个元素为2。
这是我的代码:
代码 1:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
return len(nums[i:])
这 return 数组切片的顺序相反。
Input:
[3,2,2,3]
3
Output: [3,3]
Expected: [2,2]
但是,如果我在代码 1 的末尾稍作修改,它会给出正确的输出:
nums[:] = nums[i:]
return len(nums[i:])
代码2:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
nums[:] = nums[i:]
return len(nums)
我不明白为什么我的代码 1 不起作用。有人能帮我理解为什么 slice 没有按预期工作吗?
这会如您所愿(“...删除该值的所有实例并 return 新长度”):
def remove_element(nums, val):
nums[:] = [x for x in nums if x != val]
return len(nums)
测试:
nums = [3, 2, 2, 3]
val = 3
print(remove_element(nums, val))
print(nums)
输出:
2
[2, 2]
您的第一个示例有效。
切片时会创建一个新列表。因此,在您的第一个代码示例中,您在末尾创建了一个包含 correct 结果的新列表,但从不返回它。
在您的第二个代码示例中,您将新创建的列表分配给原始列表,因此能够访问最终结果。
我正在尝试为给定数组和值编写一个程序,以删除该值的所有实例和 return 新长度。
示例: 给定输入数组 nums = [3,2,2,3], val = 3
应该returnlength = 2,nums的前两个元素为2。
这是我的代码:
代码 1:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
return len(nums[i:])
这 return 数组切片的顺序相反。
Input:
[3,2,2,3]
3
Output: [3,3]
Expected: [2,2]
但是,如果我在代码 1 的末尾稍作修改,它会给出正确的输出:
nums[:] = nums[i:]
return len(nums[i:])
代码2:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
nums[:] = nums[i:]
return len(nums)
我不明白为什么我的代码 1 不起作用。有人能帮我理解为什么 slice 没有按预期工作吗?
这会如您所愿(“...删除该值的所有实例并 return 新长度”):
def remove_element(nums, val):
nums[:] = [x for x in nums if x != val]
return len(nums)
测试:
nums = [3, 2, 2, 3]
val = 3
print(remove_element(nums, val))
print(nums)
输出:
2
[2, 2]
您的第一个示例有效。
切片时会创建一个新列表。因此,在您的第一个代码示例中,您在末尾创建了一个包含 correct 结果的新列表,但从不返回它。
在您的第二个代码示例中,您将新创建的列表分配给原始列表,因此能够访问最终结果。