2012-02-24 80 views
2

夥計們,Python函數返回一個新的列表,而無需修改輸入列表

我想有一個函數,一個列表作爲輸入,返回另一個列表,它是輸入的修改,但我不」不想改變原始列表。下面的代碼是我能做的最好的代碼嗎?另外,爲了避免錯誤,如果我將元組(a)傳遞給函數modify(a)函數並將該元組轉換爲列表中的modify(a)函數,會更好嗎?

非常感謝您的回覆。

def modify(a): 
    b = a[:] 
    # some changes on b here 
    ...... 
    return b  
+0

您是否總是使用您正在倒轉的兩元素列表? 'a = b [:: - 1]'。我沒有看到任何表明你打算交換的索引。 – 2012-02-24 22:26:38

+0

你能更詳細地說明你需要什麼嗎?這些清單將會有多長時間?您想要使用什麼樣的交換模式?您是否希望用戶能夠影響交換?擁有這種信息極大地幫助我們幫助你。 – 2012-02-24 22:27:30

+0

編輯我的評論... – 2012-02-24 22:30:30

回答

1

你的代碼看起來非常合理了,你能與b = list(a)取代b = a[:]使你的代碼更通用。也沒有理由使用tuple(a)。如果您想要走這條路線,您可以讓modify在原地工作,並將其稱爲b = modify(a[:])

0

我不明白爲什麼這不能令人滿意:

  • 你複製的列表,以便沒有關於無意中重整它
  • 元組拆包交換兩個變量,如最有效的方式後顧之憂那

保持它那樣,imo。

0

這隻會做LEN 2.

如果你發送一個元組,但它完全取決於你它並不真正的問題的列表。

0

你可以這樣做:

>>> def swap(l): 
... return l[::-1] 
... 
>>> my_list = [1,2,3] 
>>> swap(my_list) 
[3, 2, 1] 
>>> my_list 
[1, 2, 3] 

如果它是一個列表或元組沒有關係,它反正換:)

0

整理你的代碼,而只要使用a = b[::-1]去:

def swapped(b): 
    assert len(b) == 2 
    return [b[1], b[0]] 

選擇的功能名稱:swappedswapsortedsort ...表示該arg不會發生變異。

這可以很容易地被推廣:

def gather(sequence, indices): 
    return [sequence[i] for i in indices] 
5

如果列表中包含任何子列表,字典或其他的「可變」的元素,你的算法可能對其進行更改,然後淺名單副本oldlist[::-1]給你還不夠。使用模塊copy中的deepcopy爲輸入創建完全獨立的副本。

from copy import deepcopy 
newlist = deepcopy(oldlist)