Найефективніший підхід
Ви також можете вставити елемент за допомогою індексації фрагментів у списку. Наприклад:
>>> 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 the 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
порівняння всіх відповідей зі списком з 1000 елементів для Python 3.4.5:
Моя відповідь із використанням нарізаної вставки - найшвидша (3,08 мкс на петлю)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
100000 loops, best of 3: 3.08 µsec per loop
Прийнята відповідь ATOzTOA на основі злиття нарізаних списків - друге (6,71 мкс на цикл)
mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
100000 loops, best of 3: 6.71 µsec per loop
Відповідь Раші Панчала з більшістю голосівlist.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 µsec 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 µsec per loop
b = a[:].insert(2,3)
здається досить коротким, не впливає на оригінальний список і є досить описовим.