Python函数返回一个新的列表,而无需修改输入列表
问题描述:
伙计们,Python函数返回一个新的列表,而无需修改输入列表
我想有一个函数,一个列表作为输入,返回另一个列表,它是输入的修改,但我不”不想改变原始列表。下面的代码是我能做的最好的代码吗?另外,为了避免错误,如果我将元组(a)传递给函数modify(a)函数并将该元组转换为列表中的modify(a)函数,会更好吗?
非常感谢您的回复。
def modify(a):
b = a[:]
# some changes on b here
......
return b
答
你的代码看起来非常合理了,你能与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]]
选择的功能名称:swapped
是swap
为sorted
是sort
...表示该arg不会发生变异。
这可以很容易地被推广:
def gather(sequence, indices):
return [sequence[i] for i in indices]
答
如果列表中包含任何子列表,字典或其他的“可变”的元素,你的算法可能对其进行更改,然后浅名单副本oldlist[::-1]
给你还不够。使用模块copy
中的deepcopy
为输入创建完全独立的副本。
from copy import deepcopy
newlist = deepcopy(oldlist)
您是否总是使用您正在倒转的两元素列表? 'a = b [:: - 1]'。我没有看到任何表明你打算交换的索引。 – 2012-02-24 22:26:38
你能更详细地说明你需要什么吗?这些清单将会有多长时间?您想要使用什么样的交换模式?您是否希望用户能够影响交换?拥有这种信息极大地帮助我们帮助你。 – 2012-02-24 22:27:30
编辑我的评论... – 2012-02-24 22:30:30