111

我想做这样的事情:

myList = [10, 20, 30]
yourList = myList.append(40)

不幸的是,列表追加不会返回修改后的列表。

那么,我怎样才能允许append返回新列表?

4

8 回答 8

192

不要使用追加而是连接:

yourList = myList + [40]

这将返回一个列表;myList不会受到影响。如果您还需要myList影响任何使用方法,请与 (a copy of) 分开分配。.append()yourListmyList

于 2012-10-15T19:54:17.847 回答
39

在 python 3 中,您可以通过解压旧列表并添加新元素来创建新列表:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

当你这样做时:

myList + [40]

您实际上有 3 个列表。

于 2018-03-01T08:21:59.080 回答
6

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

希望这可以帮助

于 2012-10-15T19:54:27.270 回答
4

尝试使用itertools.chain(myList, [40]). 这将返回一个生成器作为序列,而不是分配一个新列表。本质上,这会返回第一个迭代中的所有元素,直到它被耗尽,然后继续下一个迭代,直到所有迭代都被耗尽。

于 2015-06-26T18:38:55.140 回答
2

您可以子类化内置列表类型并重新定义“附加”方法。或者更好的是,创建一个新的,它将做你想做的事情。下面是重新定义的“附加”方法的代码。

#!/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()

希望有帮助。

于 2012-10-15T20:04:46.690 回答
2

只是为了扩展 Storstamp 的答案

你只需要做 myList.append(40)

它会将其附加到原始列表中,现在您可以返回包含原始列表的变量。

如果您正在处理非常大的列表,那么这是要走的路。

于 2017-04-02T18:00:01.160 回答
1

不幸的是,这里没有一个答案能完全解决所问的问题。这是一个简单的方法:

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>)一些更好的方法。

于 2021-03-13T19:17:37.397 回答
-5

你只需要做 myList.append(40)

它会将其附加到原始列表中,而不是返回新列表。

于 2012-10-15T19:54:45.743 回答