我发现我必须在python中执行交换,我写这样的东西.
arr[first], arr[second] = arr[second], arr[first]
Run Code Online (Sandbox Code Playgroud)
我想这不是那么pythonic.有人知道如何在python中进行更优化的交换吗?
编辑: 我认为另一个例子将表明我的疑虑
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
Run Code Online (Sandbox Code Playgroud)
这是python中唯一可用的交换解决方案吗?我做了很多搜索,但没有找到一个好的答案......
Ada*_*tan 16
a, b = b, a
Run Code Online (Sandbox Code Playgroud)
是一个完美的Pythonic成语.只要您的变量名称足够短,它就很短且易读.
Ale*_*lli 14
我可能会在您的示例代码中更改一件事:如果您要使用某些长名称,例如重复使用self.memberlist,则通常更容易将别名("赋值")更改为更短的名称.例如,而不是漫长,难以阅读:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
Run Code Online (Sandbox Code Playgroud)
你可以编码:
L = self.memberlist
L[someindexA], L[someindexB] = L[someindexB], L[someindexA]
Run Code Online (Sandbox Code Playgroud)
请记住,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]
Run Code Online (Sandbox Code Playgroud)
我认为找出这些"高级"用途是一种很好的自负,有用的心理练习和乐趣 - 我建议有兴趣的读者,一旦总体思路清晰,就会关注这些人的作用+cmp以及他们如何使事情发挥作用对于三种可能性(a> b,a <b,a == b)[[不适用于负指数,但为什么不呢,切片机如何更改以修复此问题?]].但是在生产代码中使用这种花哨的方法通常会过度使用并且完全没有根据,使得事情比简单直接的方法更难以维护和维护.
记住,简单比复杂更好!