【问题标题】:Python array slice not working as expectedPython数组切片未按预期工作
【发布时间】:2017-05-05 06:25:24
【问题描述】:

我正在尝试为给定的数组和一个值编写一个程序,以删除该值的所有实例并返回新的长度。

示例: 给定输入数组 nums = [3,2,2,3], val = 3

它应该返回length = 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:])

这会以相反的顺序返回数组切片。

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 不能按预期工作吗?

【问题讨论】:

  • 我认为这两种方法都行不通,除非您对未提及的输入有一些限制。
  • 奇怪的是我运行了你的 code1 并且它按预期工作,即输入 [3,2,2,3] 返回 [2,2] 和长度 2。

标签: python arrays slice


【解决方案1】:

这会做你想做的事(“......删除该值的所有实例并返回新长度”):

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]

【讨论】:

    【解决方案2】:

    您的第一个示例有效。

    当您切片时,会创建一个新列表。因此,在您的第一个代码示例中,您将在末尾创建一个包含 正确 结果的新列表,但永远不会返回它。

    在您的第二个代码示例中,您将新创建的列表分配给原始列表,因此能够访问最终结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多