为什么我在 python 中使用 x,y = y,x 超出范围

Why I am out of range by using x,y = y,x in python

请求是轮换列表。当K=3时,你把[1,2,3,4,5,6,7]变成[5,6,7,1,2,3,4];当K=1时,你把[1,2,3,4,5,6,7]变成[7,1,2,3,4,5,6]

为什么我超出了范围? PyCharm 这样通知我:IndexError:列表索引超出范围

class Solution:
 def rotate(self, nums, k) -> None:
  k = k%len(nums)
  def rev(x, y, num):
      while y > x:
         num[x], num[y] = num[y], num[x]
         x += 1
         y -= 1
      rev(0, len(nums), nums)
      rev(0, k-1,nums)
      rev(k, len(nums), nums)
    
nums = [1,2,3,4,5,6,7]
s = Solution()
s.rotate(nums,3)

由于索引从 0 开始到 len(list)-1 结束,因此您有一个错误。你这样调用 rev

rev(0, len(nums), nums)

正确的是:

rev(0, len(nums)-1, nums)

此外,由于在python中可以添加带有负索引的列表和索引列表,您也可以这样解决问题:

nums = [1,2,3,4,5,6,7]

def rotate_list(list_to_rotate, k):
  return list_to_rotate[-k:] + list_to_rotate[:-k]

rotate_list(nums, 3)
# output: [5, 6, 7, 1, 2, 3, 4]

您收到索引超出范围错误,因为您试图访问列表中不存在的索引。

通常,您的列表 nums 有 7 个元素,这意味着您可以 nums[i] 如果 0<=i<=6.

要修复您的代码,您只需将 rev(0, len(nums), nums) 替换为 rev(0, len(nums)-1, nums)

class Solution:
    def rotate(self, nums, k) -> None:
        k = k % len(nums)

        def rev(x, y, num):
            while y > x:
                num[x], num[y] = num[y], num[x]
                x += 1
                y -= 1
        rev(0, len(nums)-1, nums)
        rev(0, k - 1, nums)
        rev(k, len(nums)-1, nums)


nums = [1, 2, 3, 4, 5, 6, 7]
s = Solution()
s.rotate(nums, 3)

或者,您可以使用这个更简单的实现,其中 returns 另一个列表:

class Solution:
    def rotate(self, nums, k) -> list:
        k = k % len(nums)

        return nums[-k:] + nums[:-k]


nums = [1, 2, 3, 4, 5, 6, 7]
s = Solution()
nums = s.rotate(nums, 3)