问题描述
我发现我必须在python语言中执行交换,我编写了如下内容:
arr[first], arr[second] = arr[second], arr[first]
我想这并不是那么僵化。有没有人知道如何用PYTHON更优雅地进行交换?
编辑: 我想再举一个例子来说明我的疑虑:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
这是唯一可用于在Python中进行交换的解决方案吗?
推荐答案
我可能会在您的示例代码中更改一件事:如果您要反复使用某个长名称(如self.memberlist),则首先将其别名("分配")为较短的名称通常更具可读性。例如,代替冗长、难以阅读的:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
您可以编码:
L = self.memberlist L[someindexA], L[someindexB] = L[someindexB], L[someindexA]
请记住,Python是按引用工作的,因此L引用的对象与self.memberlist完全相同,而不是副本(出于同样的原因,不管列表有多长,赋值都非常快,因为无论如何它都不会被复制--它只是多一个引用)。
我不认为有必要进一步复杂化,尽管当然可以很容易地设想一些奇特的复杂情况,例如(对于a,b"正常"指数>=0):
def slicer(a, b): return slice(a, b+cmp(b,a), b-a), slice(b, a+cmp(a,b), a-b) back, forth = slicer(someindexA, someindexB) self.memberlist[back] = self.memberlist[forth]我认为弄清楚这些"高级"用法是一种很好的自负、有用的思维练习和很好的乐趣--我建议感兴趣的读者,一旦大意清楚了,就专注于这些+cmp的作用,以及他们如何针对三种可能性(a>b,a<;b,a==b)[[不是负指数--为什么不是,Slip需要如何改变来解决这个问题?]]。但在生产代码中使用这种花哨的方法通常是矫枉过正的,而且完全没有根据,使事情比简单直接的方法更模糊,更难维护。
记住,simple is better than complex!