Python函数返回一个新的列表,而无需修改输入列表

问题描述:

伙计们,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

你的代码看起来非常合理了,你能与b = list(a)取代b = a[:]使你的代码更通用。也没有理由使用tuple(a)。如果您想要走这条路线,您可以让modify在原地工作,并将其称为b = modify(a[:])

我不明白为什么这不能令人满意:

  • 你复制的列表,以便没有关于无意中重整它
  • 元组拆包交换两个变量,如最有效的方式后顾之忧那

保持它那样,imo。

这只会做LEN 2.

如果你发送一个元组,但它完全取决于你它并不真正的问题的列表。

你可以这样做:

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

如果它是一个列表或元组没有关系,它反正换:)

整理你的代码,而只要使用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] 

如果列表中包含任何子列表,字典或其他的“可变”的元素,你的算法可能对其进行更改,然后浅名单副本oldlist[::-1]给你还不够。使用模块copy中的deepcopy为输入创建完全独立的副本。

from copy import deepcopy 
newlist = deepcopy(oldlist)