我发现我必须在python中执行交换,我写这样的东西。
arr[first], arr[second] = arr[second], arr[first]
我想这不是那么pythonic。有人知道如何在python中进行更优化的交换吗?
修改 我认为另一个例子将表明我的怀疑
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
这是python中唯一可用的swap解决方案吗? 我做了很多搜索,但没有找到一个好的答案......
答案 0 :(得分:17)
a, b = b, a
Is a perfectly Pythonic idiom.只要您的变量名称足够短,它就简短易读。
答案 1 :(得分:14)
我可能会在您的示例代码中更改一件事:如果您要重复使用某些长名称(例如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]
我认为找出这些“高级”用途是一种很好的自负,有用的心理练习和乐趣 - 我建议感兴趣的读者,一旦总体思路清晰,就会关注那些{{1以及它们如何使事物适用于三种可能性(a> b,a< b,a == b)[[不适用于负指数,但为什么不呢?切片机如何更改以解决此问题? ]。但是在生产代码中使用这种花哨的方法通常会过度而且毫无根据,使得事情比简单直接的方法更难以维护和维护。
答案 2 :(得分:1)
很难想象它如何变得更优雅:使用假设的内置函数...... swap_sequence_elements(arr, first, second)
优雅?也许,但这是在YAGGI的领域 - 你不会得到它;-) - 函数调用开销会/你应该让你自己实现它。
你拥有的东西比替代的在线方式更优雅:
temp = arr[first]
arr[first] = arr[second]
arr[second] = temp
和(奖励!)也更快(假设字节码ROT_TWO
比LOAD_FAST
加STORE_FAST
更快的非理性假设。)
答案 3 :(得分:1)
a, b = b, a
差不多就会得到它,它只有三个字符(除了变量名称之外)..它就像你得到的Python一样
另一种选择是通常的使用-a-temp变量:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
.. ..变为
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
答案 4 :(得分:-1)
我想你可以利用切片表示法的步骤参数来做这样的事情:
myarr [:2] = myarr [:2] [:: - 1]
我不确定这是更清晰或更pythonic但是......