【问题标题】:Python reverse list with k steps, in-place operator vs standard operator [closed]具有k步的Python反向列表,就地运算符与标准运算符[关闭]
【发布时间】:2020-09-06 21:48:06
【问题描述】:

Python list nums = [1,2,3,4,5,6,7], k = 3. 将数组向右旋转 k 步。

A:

有什么区别
nums[:k] = nums[len(nums)-k:]
nums[k:] = nums[:len(nums)-k]

B:

nums[:k], nums[k:] = nums[len(nums)-k:], nums[:len(nums)-k]

A 的输出是[5,6,7,5,6,7,4]
B 的输出是[5,6,7,1,2,3,4]

您能否解释一下它是如何工作的以及为什么输出不同?

【问题讨论】:

  • 请从intro tour 重复on topichow to ask。在您发布时,我们希望您已经手动模拟了代码(因为它很短),并插入了战略性的 print 语句来跟踪值。展示这项工作的结果,并解释你不理解复合赋值和/或切片的地方。

标签: python list


【解决方案1】:

最简单的方法是在每次操作后检查nums 的外观(在草稿中使用print(nums) 或在终端中调用它(nums))。下次自己试试吧。

A
在第一行 (nums[:k] = nums[len(nums)-k:]) 中:nums = [5, 6, 7, 4, 5, 6, 7] - 您已将 nums[0:3] (1, 2, 3) 替换为 nums[4:7] (5, 6, 7)。

然后,使用第二行 (nums[k:] = nums[:len(nums)-k]):nums = [5, 6, 7, 5, 6, 7, 4] - 您已将 nums[3:7] (4, 5, 6, 7) 替换为 nums[0:4] (5, 6, 7, 4)。

B
您已经“就地”完成了这些操作,而没有更改它们之间的nums。你已经“抓住”了1, 2, 3, 45, 6, 7,列出了[5,6,7,1,2,3,4] 并将其分配给nums,并覆盖了它的值([1,2,3,4,5,6,7])。

【讨论】:

  • 感谢您的及时回答,您说得非常清楚!同意,每次操作后我都会打印出来试一试。
  • 您好,您能解释一下为什么采用第二种解决方案吗?是不是都写在一行里?
  • 我不知道这是否是个好词,但通常是的。就像我上面写的那样发生 - 你首先从nums 中获取nums[len(nums)-k:]nums[:len(nums)-k] 但它仍然没有改变。然后,您分别通过 = 将其分配给 nums[:k]nums[k:] 正在更改的 nums
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多