【问题标题】:Swap slices of indexes using a function使用函数交换索引切片
【发布时间】:2016-08-25 12:40:39
【问题描述】:

后续问题: Python swap indexes using slices

r = ['1', '2', '3', '4', '5', '6', '7', '8'] 

如果我想使用函数交换切片,正确的方法是什么?

def swap(from,to):
  r[a:b+1], r[c+1:d] = r[c:d], r[a:b]

swap(a:b,c:d)

我想在 r 中将数字 3 + 4 与 5 + 6 + 7 交换:

swap(2:4,4:7)

这对吗?

【问题讨论】:

  • 如果处理得当,它应该可以工作,即没有所有这些语法错误(from 不能用作变量名,2:4,4:7 不是你切片的方式)

标签: python list python-3.x indexing swap


【解决方案1】:

无需任何计算,就可以做到:

def swap(r,a,b,c,d):
   assert a<=b<=c<=d  
   r[a:d]=r[c:d]+r[b:c]+r[a:b]

【讨论】:

  • 不错,直接,有效的方法。
  • 如果问题只是“如何交换列表的各个部分?”我会做类似return r[:a] + r[c:d] + r[b:c] + r[a:b] + r[d:] 的事情,但我被切片分配解包卡住了。这个答案将简单的方法与节省内存的就地切片分配相结合,这可能是效率和简单性的最佳组合。
【解决方案2】:

一个有趣(但很傻,B.M. 的显然更好)的解决方案是创建一个支持切片的对象:

class _Swapper(object):
    def __init__(self, li):
        self.list = li

    def __getitem__(self, item):
        x = list(item)
        assert len(x) == 2 and all(isinstance(i) for i in x)
        self.list[x[0]], self.list[x[1]] = self.list[x[1]], self.list[x[0]]

def swap(li):
    return _Swapper(li)

swap(r)[a:b, c:d]

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2021-12-31
    • 2018-07-29
    相关资源
    最近更新 更多