2016-04-30 2 views
1

последующий вопрос о: 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) 

Я хочу поменять номера 3 + 4 с 5 + 6 + 7 в г:

swap(2:4,4:7) 

Правильно ли это?

+1

Он должен работать, если все сделано правильно, то есть без всех этих синтаксических ошибок ('from' не может использоваться как имя переменной, а' 2: 4,4: 7' - это не то, как вы нарезаете) – DeepSpace

ответ

7

без каких-либо расчетов, вы можете сделать:

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

Nice, straight, подход. – TigerhawkT3

+0

Если вопрос только что был «как мне поменять разделы списка?» Я бы сделал что-то вроде 'return r [: a] + r [c: d] + r [b: c] + r [a: b] + r [d:]', но я застрял с срезом распаковка. Этот ответ сочетает в себе простой подход с сохранением памяти на месте назначения среза, что, вероятно, является оптимальной комбинацией эффективности и простоты. – TigerhawkT3

1

Интересно (но глупо один, то один БМ явно лучше) решением было бы создать объект, который поддерживает нарезки:

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]