你可以讓這一點通過使用if
表達短:
def f(objects):
list_type = "string_x"
other = "string_y"
hold = []
for x in objects:
hold.append((list_type if isinstance(x[1], list) else other, x[1]))
return hold
然後很容易變成理解,它更短,可能更易讀,更快一些:*
def f(objects):
list_type = "string_x"
other = "string_y"
return [(list_type if isinstance(x[1], list) else other, x[1])
for x in objects]
真的,我不知道那些局部變量是使事情更清楚:**
def f(objects):
return [("string_x" if isinstance(x[1], list) else "string_y", x[1])
for x in objects]
同時,如果你要與返回的列表做的唯一事情就是迭代(例如,因爲這只是轉換鏈中的一個),你根本不應該返回一個列表。無論是yield
每個值,返回genexpr而不是listcomp,或者(如果你有Python的3.3+)獲得兩全其美:
def f(objects):
yield from (("string_x" if isinstance(x[1], list) else "string_y", x[1])
for x in objects)
*您還在做同樣的循環,所以你有完全相同的算法複雜性。然而,循環和列表追加都是通過採用一些快捷方式的自定義字節碼來實現的,這使得每次迭代更加高效。 (「自定義字節碼」的細節當然具體到CPython的和其他的字節碼兼容的實現比如PyPy,但在一般情況下,任何實現至少可能承擔list解析快捷方式。)
**這最後很可能稍微快一點,因爲它將常量加載到堆棧而不是本地變量。再次,它可能也有稍差的緩存局部性。如果真的很重要,請測試並看看。
燦你舉了一個你作爲'objects'傳遞的例子嗎? – brandonscript
「高效」是指「快速」還是「可讀」或其他不同?是什麼讓你覺得它效率不高? – abarnert
無論你如何去做,地圖,列表理解或其他,它必須是*某種排序*循環 – yuvi