Python的交换?(Pythonic Swap?)

2019-06-26 07:40发布

我发现,我必须执行Python中的交换和我写这样的事情。

arr[first], arr[second] = arr[second], arr[first]

我想这也不是那么Python的。 是否有人知道该怎么做在python更高贵的交换?

编辑:我想其他的例子表明了我的疑虑

self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]

这是在python交换唯一可用的解决方案? 我搜索了很多,但没有找到一个很好的答案...

Answer 1:

有一件事我可能会在你的示例代码改变:如果你打算使用一些长的名称,如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 ==二)[不是负指数,虽然 - 为什么不呢,怎么会分割器需要更改为解决这个问题]。 但在生产中使用代码这样一个奇特的办法一般会矫枉过正,相当不合理,使事情比较令人费解和难以维持比简单和直接的方法。

请记住, 简单比复杂好 !



Answer 2:

a, b = b, a

是一个完全符合Python的成语。 这是短期和可读性,只要你的变量名是足够短。



Answer 3:

这是很难想象它如何变得更优雅:使用假设内置函数... swap_sequence_elements(arr, first, second)优雅? 也许,但是这是在YAGGI领土 - 你是不会得到它;-) - 和函数调用的开销会/应该把你关自己实现它。

你有什么是要比替代的在线方式更优雅:

temp = arr[first]
arr[first] = arr[second]
arr[second] = temp

和(奖金!)是也更快(在没有不合理的假设,即字节码ROT_TWO比快LOAD_FAST加上STORE_FAST )。



Answer 4:

a, b = b, a大约是短,你会得到的,它只有三个字符(除了变量名)..这是我们所Python'y,你会得到

一种替代方法是在通常的使用-A-临时变量:

self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]

..becomes ..

temp = self.memberlist[someindexB]
self.memberlist[someindexB] = self.memberlist[someindexA]
self.memberlist[someindexA] = temp

..这我觉得是混乱和不那么“显而易见”

另一种方式,这也许是更多的可读性与长变量名:

a, b = self.memberlist[someindexA], self.memberlist[someindexB]
self.memberlist[someindexA], self.memberlist[someindexB] = b, a


Answer 5:

我想你可以利用切片表示法的步骤参数做这样的事情:

MERR [2] = MERR [2] [:: - 1]

我不知道这是更清晰或更Python,但...



文章来源: Pythonic Swap?
标签: python swap