【问题标题】:Modify a int list in function in python在python中的函数中修改一个int列表
【发布时间】:2016-04-05 00:02:48
【问题描述】:

我想在 python 的列表中旋转 k 元素。比如n=7,k=3,数组[1,2,3,4,5,6,7]旋转到[5,6,7,1,2,3,4]。

这是我写的声明。它似乎在命令行中工作。

nums = nums[k%len(nums):] + nums[:k%len(nums)]

但是当我将它封装在一个函数中时:

def rotate(nums, k):
    nums = nums[k%len(nums):] + nums[:k%len(nums)]
    return

我想直接修改nums,但是这个功能不起作用。

我知道我可以使用这样的 for 循环:

for i in range(k):
    nums.insert(0,nums.pop())

但我想知道为什么以前的方法不起作用?

【问题讨论】:

  • 您在函数内创建一个新列表,然后不返回或分配任何结果;你为什么期望它在函数之外进行更改?
  • nums=... 设置局部变量nums,但不改变实际的原始列表nums。对于逆问题,请参阅stackoverflow.com/questions/2322068/…
  • 旁注:即使使用切片分配进行修复,如果list 的大小很大(您制作list 的完整副本,然后复制回原始@ 987654332@);如果旋转序列在您的用例中很重要,请考虑使用using collections.deque,它可以更有效地执行旋转,并直接支持in-place rotation

标签: python algorithm


【解决方案1】:

你想要的是一个切片赋值:

nums[:] = nums[k%len(nums):] + nums[:k%len(nums)]

这会改变传入的列表,因此在函数返回后更改是可见的。仅分配给nums 只会使nums 指向函数内的不同列表;它不会影响原始列表。

【讨论】:

    【解决方案2】:

    您确定要修改数字吗?即使不修改 nums,也无需创建单独的列表。以下方法的一个优点是它适用于任何序列。

    from itertools import islice
    def rotate(lst, k):
        n = len(lst)
        start = n - (k % n)  #handle all ints
        for item in islice(lst, start, None):
            yield item
        for item in islice(lst, 0, start):
            yield item
    

    如果你坚持按你说的修改 nums,你仍然可以这样做。例如,

    nums = [x + 1 for x in range(7)]
    nums[:] = rotate(nums,-10)
    

    【讨论】:

      【解决方案3】:

      函数内的nums 仅在该函数内。所以你需要从那个函数中返回它。一种方法是这样的(python 2.7代码,如果你使用3.x,请在print添加括号):

      nums = [1, 2, 3, 4, 5, 6, 7]
      k = 3
      
      
      def rotate(nums, k):
          return nums[k%len(nums):] + nums[:k%len(nums)]
      
      print 'Original', nums
      nums = rotate(nums, k)
      print 'Rotated', nums
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-09
        • 2012-06-05
        • 1970-01-01
        • 2015-01-31
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        相关资源
        最近更新 更多