Подтвердить что ты не робот

Вставьте элемент по определенному индексу в список и верните обновленный список

У меня есть это:

>>> 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]

Могу ли я в любом случае получить обновленный список вместо обновления исходного списка?

4b9b3361

Ответ 1

Короче, я получил: 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]

Ответ 2

l.insert(index, obj) самом деле ничего не возвращает, он просто обновляет список. Как сказал ATO, вы можете сделать b = a[:index] + [obj] + a[index:]. Однако другой способ:

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

Ответ 3

Наиболее эффективный подход

Вы также можете вставить элемент, используя индексирование фрагментов в списке. Например:

>>> 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 сравнение всех ответов со списком из 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 usec 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 usec per loop
    
  • Ответ Rushy Panchal с большинством голосов с использованием list.insert(...) - третий (26,5 раз за цикл)

    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
    

Ответ 4

Используйте метод вставки списка Python(). Использование:

Синтаксис

Ниже приведен синтаксис метода insert():

list.insert(index, obj)

параметры

  • index - это индекс, в который нужно вставить объект obj.
  • obj - это объект, который нужно вставить в данный список.

Возвращаемое значение

Этот метод не возвращает никакого значения, но он вставляет данный элемент по указанному индексу.

Пример:

a = [1,2,4,5]

a.insert(2,3)

print(a)

Возвращает [1, 2, 3, 4, 5]