最も効率的なアプローチ
リストのスライスインデックスを使用して要素を挿入することもできます。例えば:
>>> 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]
リスト内包表記を使用した代替方法 (ただし、パフォーマンスの点で非常に遅い):
別の方法として、リスト内包表記を使用しても実現できますenumerate
。(ただし、この方法で行わないでください。これは説明のためのものです):
>>> 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]
すべてのソリューションのパフォーマンス比較
以下はtimeit
、Python 3.4.5のすべての回答と1000要素のリストの比較です。
スライスされた挿入を使用した地雷の回答 -最速(ループあたり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のほとんどの投票での回答 -3list.insert(...)
番目(ループあたり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
鉱山の答えとリスト理解とenumerate
四- (ループあたり168マイクロ秒と非常に遅いです)
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
b = a[:].insert(2,3)
かなり短く見え、元のリストには影響せず、かなり説明的です。