web-dev-qa-db-ja.com

リスト内の特定のインデックスに要素を挿入し、更新されたリストを返します

私はこれを持っています:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

とにかく、元のリストを適切に更新する代わりに、結果として更新されたリストを取得できますか?

66
ATOzTOA

最短:b = a[:2] + [3] + a[2:]

>>> 
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]
30
ATOzTOA

l.insert(index, obj)は実際には何も返さず、リストを更新するだけです。 ATOが言ったように、b = a[:index] + [obj] + a[index:]を実行できます。ただし、別の方法は次のとおりです。

a = [1, 2, 4]
b = a[:]
b.insert(2, 3)
67
Rushy Panchal

最も効率的なアプローチ

リスト内のslice indexingを使用して要素を挿入することもできます。例えば:

>>> a = [1, 2, 4]
>>> insert_at = 2  # index at which you want to insert item

>>> b = a[:]   # created copy of list "a" as "b"
               # skip this step if you are ok with modifying original list

>>> b[insert_at:insert_at] = [3]  # insert "3" within "b"
>>> b
[1, 2, 3, 4]

複数の要素を特定のインデックスに一緒に挿入する場合、行う必要があるのは、挿入する複数の要素のlistを使用することだけです。例えば:

>>> a = [1, 2, 4]
>>> insert_at = 2   # index starting from which multiple elements will be inserted 

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

リスト内包表記を使用する代替案(ただし、パフォーマンスの点で非常に遅い)

代替として、list comprehensionenumerate を使用して実現することもできます。 (しかし、このようにしないでください。それは単に例示のためです)

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

すべてのソリューションのパフォーマンス比較

Python 3.4.5の1000要素のリストとすべての回答の比較 timeit を次に示します。

  • Mine answer スライス挿入を使用-最速(ループごとに3.08 usec)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
    100000 loops, best of 3: 3.08 usec per loop
    
  • ATOzTOAの受け入れられた回答 スライスされたリストのマージに基づいて-2番目(ループごとに6.71 usec)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
    100000 loops, best of 3: 6.71 usec per loop
    
  • Rushy Panchal's answerlist.insert(...)-を使用してほとんどの票で3番目(ループごとに26.5 usec)

    python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
    10000 loops, best of 3: 26.5 usec per loop
    
  • 私の答え withList Comprehensionand enumerate-Fourth(very slowループあたり168 usec)

    mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
    10000 loops, best of 3: 168 usec per loop
    
31