【问题标题】:What does this construct do? [duplicate]这个结构有什么作用? [复制]
【发布时间】:2016-12-29 19:27:16
【问题描述】:

例子

num = [0,3,5,3,0,0,9,8] 

输出应该是

[3,5,3,9,8,0,0,0]

在 Python 中解决这个问题的方法是

def moveZeroes(self, nums):
    zero, cur = -1, 0
    while cur < len(nums):
        if  nums[cur] != 0:
            # update zero index when current is not zero
            zero += 1
            nums[cur], nums[zero] = nums[zero], nums[cur]
        cur += 1

我的问题是我经常看到类似的说法

nums[cur], nums[zero] = nums[zero], nums[cur]

这个语句具体是做什么的?

【问题讨论】:

标签: python data-structures


【解决方案1】:

此代码nums[cur], nums[zero] = nums[zero], nums[cur] 是交换 nums 数组中的两个值。就像你写的一样:

temp = nums[cur]
nums[cur] = nums[zero]
nums[zero] = temp

当您在 = 赋值运算符的两边都使用逗号时,Python 本质上是一次完成所有赋值,因此您不需要 temp 变量。

【讨论】:

  • 非常感谢。语句 zero, cur = -1, 0 中的初始值 zero = -1 和 cur = 0 也是如此
  • 由于zero 和cur 是数组索引,如果它们中的任何一个具有值-1,则交换将失败,因为这不是有效的索引。但这永远不会发生,因为循环中的交换语句前面是zero += 1。另请注意,代码不会交换zero 和cur 变量的值,它会交换每个值对应的两个数组元素。例如,如果zero 是3 并且cur 是7,它将交换第四个和第八个数组元素(因为数组索引从0 开始)。
【解决方案2】:

成语

>>> a, b = b, a

一步交换a 和b 中的值,使a 现在指向b 曾经指向的值,反之亦然:

>>> a, b = 1, 2
>>> a
1
>>> b
2
>>> a, b = b, a
>>> a
2
>>> b
1

从技术上讲,右侧创建一次性元组,左侧是元组解包分配。

nums[cur], nums[zero] = nums[zero], nums[cur]

then 表示“交换索引zero 和索引cur 的元素。

【讨论】:

    【解决方案3】:

    它正在交换值。

    a, b = b, a
    

    现在a 的值为b,b 的值为a

    【讨论】:

      【解决方案4】:

      这是一个变量交换,Python 风格。它构造了两个值的tuple,即zero 和cur 的值,然后解包tuple 并将值分配给cur 和zero 的索引;通过反转分配给的索引,它交换值。

      请注意,通过重新利用 sort 方法的 key 参数让 Python 在 C 层完成工作,可以显着简化代码(尽管可能会以运行速度稍慢为代价):

      def moveZeroes(self, nums):
          nums.sort(key=lambda x: x == 0)
          # Or more efficiently but obscurely:
          # nums.sort(key=(0).__eq__)
          # Or with an operator import to get speed with less obscurity:
          # nums.sort(key=operator.not_)
      

      由于 Python 的 TimSort 算法是稳定的,这会保留所有非零值的顺序,同时将零移动到末尾。

      【讨论】:

        【解决方案5】:

        这是 Python 的元组打包和解包功能。

        它的功能与

        相同
        temp = nums[cur]
        nums[cur] = nums[zero]
        nums[zero] = temp
        

        但对计算机来说更高效,对程序员来说更易读。

        延伸阅读:https://stackoverflow.com/a/14836456/5399734

        【讨论】:

          【解决方案6】:

          它首先评估右侧的两个值,然后将它们替换到左侧的匹配槽中。所以基本上:

          a, b = b, a
          

          就像:

          c = b
          d = a
          a = c
          b = d
          

          在不创建额外变量的情况下交换值或对它们执行一些操作特别有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-13
            • 1970-01-01
            • 2016-05-31
            • 2011-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多