111

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

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

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

appendでは、どうすれば新しいリストを返すことができますか?

4

8 に答える 8

192

代わりに、追加ではなく連結を使用してください。

yourList = myList + [40]

これにより、新しいリストが返されます。myList影響を受けません。いずれにせよ、myList影響を与える必要がある場合は、(のコピー)とは別に.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

組み込みのリスト型をサブクラス化し、「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 __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 に答える