2个列表元素的古典式互换 [英] Pythonic Swap of 2 lists elements

查看:0
本文介绍了2个列表元素的古典式互换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现我必须在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

这篇关于2个列表元素的古典式互换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆