web-dev-qa-db-ja.com

Allow Python list appendメソッドは新しいリストを返す

私はこのようなことをしたい:

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

残念ながら、リストの追加は変更されたリストを返しません。

つまり、appendが新しいリストを返すことを許可するにはどうすればよいですか?

52
Wilk

Appendではなく連結を使用しないでください。

_yourList = myList + [40]
_

これはnewリストを返します。 myListは影響を受けません。 myListに影響を与える必要がある場合同様にいずれにせよ.append()を使用し、yourList(のコピー)とは別にmyList

97
Martijn Pieters

python 3では、古いリストを解凍して新しい要素を追加することにより、新しいリストを作成できます。

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

あなたがするとき:

myList + [40]

実際には3つのリストがあります。

11

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よりもはるかに時間がかかる新​​しいリストが作成されることです。

お役に立てれば

6
inspectorG4dget

組み込みリスト型をサブクラス化し、「append」メソッドを再定義できます。またはさらに良いことに、あなたがやりたいことをする新しいものを作成してください。以下は、再定義された 'append'メソッドのコードです。

#!/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 __== '__main__':
  main()

お役に立てば幸いです。

2

itertools.chain(myList, [40])を使用してみてください。それは、新しいリストを割り当てるのではなく、シーケンスとしてジェネレーターを返します。基本的に、最初の反復可能要素からすべての要素が返されるまで返され、次にすべての反復可能要素がなくなるまで次の反復可能要素に進みます。

1
jsears

Storstampの答えを拡張するだけ

MyList.append(40)を実行するだけです

元のリストに追加します。元のリストを含む変数を返すことができます。

非常に大きなリストを使用している場合、これが方法です。

0
ajayinvictus10