簡體   English   中英

Pythonic Swap?

[英]Pythonic Swap?

我發現我必須在python中執行交換,我寫這樣的東西。

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

我想這不是那么pythonic。 有人知道如何在python中進行更優化的交換嗎?

編輯:我認為另一個例子將表明我的疑慮

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

這是python中唯一可用的交換解決方案嗎? 我做了很多搜索,但沒有找到一個好的答案......

a, b = b, a

是一個完美的Pythonic成語。 只要您的變量名稱足夠短,它就很短且易讀。

我可能會在您的示例代碼中更改一件事:如果您要self.memberlist使用某個長名稱(例如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)[[不適用於負指數,但為什么不呢,切片機如何更改以修復此問題?]]。 但是在生產代碼中使用這種花哨的方法通常會過度使用並且完全沒有根據,使得事情比簡單直接的方法更晦澀難懂。

記住, 簡單比復雜更好

很難想象它如何變得更優雅:使用假設的內置函數... swap_sequence_elements(arr, first, second)優雅? 也許,但這是在YAGGI領域 - 你不會得到它;-) - 並且函數調用開銷將/應該讓你自己實現它。

你擁有的東西比替代的在線方式更優雅:

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

並且(獎勵!)也更快(在不合理的假設下,字節碼ROT_TWOLOAD_FAST加上STORE_FAST )。

a, b = b, a大約和你得到的一樣短,它只有三個字符(除了變量名之外)..它就像你會得到的Python一樣

一種替代方法是通常使用-a-temp變量:

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

我想你可以利用切片表示法的step參數來做這樣的事情:

myarr [:2] = myarr [:2] [:: - 1]

我不確定這是更清晰或更pythonic雖然...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM