Вот один из способов добиться этого. Создайте заново список, используя функцию, которая применит соответствующее сопоставление.
def swap(p, (r1,c1), (r2,c2)):
def getitem(r,c):
if (r,c) == (r1,c1): return p[r2][c2]
elif (r,c) == (r2,c2): return p[r1][c1]
return p[r][c]
return [ [getitem(r,c) for c in range(len(p[0]))] for r in range(len(p)) ]
Вы могли бы даже пойти дальше и сделать функцию реальным интерфейсом, где каждый обмен просто возвращает функцию, которая выполняет соответствующие преобразования, прежде чем перейти к функции ниже. Не особенно производительный, но довольно простой функциональный подход, который обходится без неприятных изменяемых структур данных:
def swap(f, (r1,c1), (r2,c2)):
def getitem(r,c):
if (r,c) == (r1,c1): return f(r2,c2)
elif (r,c) == (r2,c2): return f(r1,c1)
return f(r,c)
return getitem
l=[ [1,2,3], [4,5,6], [7,8,0]]
f=lambda r,c: l[r][c] # Initial accessor function
f=swap(f, (2,1), (2,2)) # 8 right
f=swap(f, (1,1), (2,1)) # 5 down
print [[f(x,y) for y in range(3)] for x in range(3)]
# Gives: [[1, 2, 3], [4, 0, 6], [7, 5, 8]]