列表[:]中的ele和列表差异中的ele的python是什么?

时间:2016-08-09 20:02:49

标签: python list for-loop data-structures

所以leetcode中有一个问题很简单,但第二个解决方案不正确: (OG问题: 给定一个数组nums,写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序。

例如,给定nums = [0,1,0,3,12],在调用函数后,nums应为[1,3,12,0,0]。

注意: 您必须就地执行此操作,而无需复制阵列。 最小化操作总数。 )

class Solution(object):
def moveZeroes(self, nums):
    """
    :type nums: List[int]
    :rtype: void Do not return anything, modify nums in-place instead.
    """
    k = 0
    for ele in nums[:]:
        if ele == 0:
            nums.remove(0)
            k += 1
    nums.extend([0]*k)


class Solution(object):   -------Incorrect solution
def moveZeroes(self, nums):
    """
    :type nums: List[int]
    :rtype: void Do not return anything, modify nums in-place instead.
    """
    k = 0
    for ele in nums:
        if ele == 0:
            nums.remove(0)
            k += 1
    nums.extend([0]*k)

为什么这会产生影响呢?

2 个答案:

答案 0 :(得分:0)

您可以不复制列表,也不能在循环播放时修改列表:

class Solution(object):
    def moveZeroes(self, numbers):
        """
        :type numbers: List[int]
        :rtype: void Do not return anything, modify numbers in-place instead.
        """
        k = 0

        while True:
            try:
                numbers.remove(0)
                k += 1
            except ValueError:
                break

        numbers.extend([0] * k)

numbers = [0, 1, 0, 3, 12]

print(id(numbers), "->", numbers)

Solution().moveZeroes(numbers)

print(id(numbers), "->", numbers)

<强>输出:

(4348993904, '->', [0, 1, 0, 3, 12])
(4348993904, '->', [1, 3, 12, 0, 0])

答案 1 :(得分:0)

循环播放列表时无法修改列表。这在Python中是非法的。

[:]制作列表的独立副本以进行循环。

但问题要求您不要复制列表,因此两种解决方案都不正确。

我不会告诉你究竟如何修复它因为我想让你学习,但是你应该创建一套。每当您使用.remove()时,请将其添加到集合中。在开始for循环之前检查元素是否在集合中。在循环结束时,实际上从列表中删除集合中的元素。

要创建集,请使用set()。要向集合添加元素,请使用set_name.add()

不要使用leetcode来学习Python。 Leetcode用于技术编码访谈,你的python不是很好。你不会通过面试。

您的代码违反了PEP 8,您的课程不会继承object。你的缩进也是错误的,这导致Python出错。得到像PyCharm这样的编辑器(它是免费的)可以在将来警告你这些错误。这是一个很棒的IDE,认真一点,尝试一下。