我想做这样的事情:
myList = [10, 20, 30]
yourList = myList.append(40)
不幸的是,列表追加不会返回修改后的列表。
那么,我怎样才能允许append
返回新列表?
不要使用追加而是连接:
yourList = myList + [40]
这将返回一个新列表;myList
不会受到影响。如果您还需要myList
影响任何使用方法,请与 (a copy of) 分开分配。.append()
yourList
myList
在 python 3 中,您可以通过解压旧列表并添加新元素来创建新列表:
a = [1,2,3]
b = [*a,4] # b = [1,2,3,4]
当你这样做时:
myList + [40]
您实际上有 3 个列表。
list.append
是内置的,因此无法更改。但如果你愿意使用 以外的东西append
,你可以尝试+
:
In [106]: myList = [10,20,30]
In [107]: yourList = myList + [40]
In [108]: print myList
[10, 20, 30]
In [109]: print yourList
[10, 20, 30, 40]
当然,这样做的缺点是创建一个新列表需要更多时间append
希望这可以帮助
尝试使用itertools.chain(myList, [40])
. 这将返回一个生成器作为序列,而不是分配一个新列表。本质上,这会返回第一个迭代中的所有元素,直到它被耗尽,然后继续下一个迭代,直到所有迭代都被耗尽。
您可以子类化内置列表类型并重新定义“附加”方法。或者更好的是,创建一个新的,它将做你想做的事情。下面是重新定义的“附加”方法的代码。
#!/usr/bin/env python
class MyList(list):
def append(self, element):
return MyList(self + [element])
def main():
l = MyList()
l1 = l.append(1)
l2 = l1.append(2)
l3 = l2.append(3)
print "Original list: %s, type %s" % (l, l.__class__.__name__)
print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
print "List 3: %s, type %s" % (l3, l3.__class__.__name__)
if __name__ == '__main__':
main()
希望有帮助。
只是为了扩展 Storstamp 的答案
你只需要做 myList.append(40)
它会将其附加到原始列表中,现在您可以返回包含原始列表的变量。
如果您正在处理非常大的列表,那么这是要走的路。
不幸的是,这里没有一个答案能完全解决所问的问题。这是一个简单的方法:
lst = [1, 2, 3]
lst.append(4) or lst # the returned value here would be the OP's `yourList`
# [1, 2, 3, 4]
有人可能会问这样做的真正需要,比如当有人需要提高 RAM 使用率、做微基准测试等时,这些通常是无用的。然而,有时有人真的在“问什么”(我不知道这里是不是这样),而现实比我们所知道的更加多样化。所以这是一个(因为脱离上下文而设计的)用法......而不是这样做:
dic = {"a": [1], "b": [2], "c": [3]}
key, val = "d", 4 # <- example
if key in dic:
dic[key].append(val)
else:
dic[key] = [val]
dic
# {'a': [1], 'b': [2], 'c': [3], 'd': [4]}
key, val = "b", 5 # <- example
if key in dic:
dic[key].append(val)
else:
dic[key] = [val]
dic
# {'a': [1], 'b': [2, 5], 'c': [3], 'd': [4]}
可以在任何需要表达式(而不是语句)的地方使用上面的 OR 表达式:
key, val = "d", 4 # <- example
dic[key] = dic[key].append(val) or dic[key] if key in dic else [val]
# {'a': [1], 'b': [2], 'c': [3], 'd': [4]}
key, val = "b", 5 # <- example
dic[key] = dic[key].append(val) or dic[key] if key in dic else [val]
# {'a': [1], 'b': [2, 5], 'c': [3], 'd': [4]}
或者,等效地,当列表中没有虚假值时,可以尝试dic.get(key, <default value>)
一些更好的方法。
你只需要做 myList.append(40)
它会将其附加到原始列表中,而不是返回新列表。