목록의 특정 색인에 요소를 삽입하고 업데이트 된 목록을 반환합니다.


99

나는 이것을 가지고있다:

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

원래 목록을 제자리에 업데이트하는 대신 업데이트 된 목록을 결과로 가져올 수있는 방법이 있습니까?


11
b = a[:].insert(2,3)꽤 짧아 보이며 원래 목록에 영향을주지 않으며 매우 설명 적입니다.
mkoistinen 2014-06-26

6
@mkoistinen 그것은 나를 위해 작동하지 않습니다. >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
SparkAndShine 2015

답변:


89

l.insert(index, obj)실제로 아무것도 반환하지 않습니다. 목록 만 업데이트합니다.

ATO가 말했듯이 b = a[:index] + [obj] + a[index:]. 그러나 다른 방법은 다음과 같습니다.

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

56
읽을 수있는 3 줄의 코드를 견딜 수 없다면 함수에 넣고 호출하십시오.
IceArdor

54

가장 효율적인 방법

목록에서 슬라이스 인덱싱 을 사용하여 요소를 삽입 할 수도 있습니다 . 예를 들면 :

>>> 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은 Python 3.4.5의 1000 개 요소 목록과 모든 답변을 비교 한 것입니다.

  • 슬라이스 삽입을 사용한 내 답변 -가장 빠름 (루프 당 3.08µsec)

     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µsec )

     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
  • 가장 많이 투표 한 Rushy Panchal의 답변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

2
나는이 결과가 문제를 해결하기 위해 쉽게 확장되기 때문에 정말 마음에 듭니다. 값 3, 3.5을 목록에 (순서대로) 삽입하려면 어떻게해야합니까? -> a[2:2] = [3,3.5]. 매우 깔끔한
minillinim

1
a [2 : 2] = a_list는 어떻게 작동합니까? a [2 : 2]는 기본적으로 두 번째 색인에서 첫 번째 색인 (2-1)까지 시작하지만 정방향으로되어 빈 [] 목록을 의미합니다. 어떻게 확장됩니까? [2 : 3 : -1]하면 작동하지 않습니다.
SamCodes

좋은 대답입니다. 최선의 선택의 복잡성이 O (1)인지 궁금합니다. 그렇다면 그 이유는 무엇입니까?
Lerner Zhang

이 답변을 업데이트해야합니다. 한 번 나는 Python 3.4에서도보고 된 타이밍을 재현 할 수 없으며 ( list.insert와 슬라이스 할당 사이에 요소 2가 있음 ) Python 3.8에서는이 차이가 완전히 사라졌습니다. 요소를 삽입하는 가장 명확한 방법은 list.insert분명히 를 사용하는 것 입니다.
a_guest

39

내가 얻은 가장 짧은 : 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]

코드 줄의 수는 코드 품질의 좋은 척도가 아닙니다. 이 접근 방식은 성능과 가독성 모두에서 결함이 있습니다.
a_guest

0

가장 깨끗한 방법은 목록을 복사 한 다음 개체를 복사본에 삽입하는 것입니다. Python 3에서는 다음을 통해 수행 할 수 있습니다 list.copy.

new = old.copy()
new.insert(index, value)

Python 2에서 목록 복사는 다음을 통해 얻을 수 있습니다 new = old[:](Python 3에서도 작동합니다).

성능면에서 제안 된 다른 방법과 차이가 없습니다.

$ python --version
Python 3.8.1
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b.insert(500, 3)"
100000 loops, best of 5: 2.84 µsec per loop
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b[500:500] = (3,)"
100000 loops, best of 5: 2.76 µsec per loop

-1

사용 파이썬 목록 삽입 () 메소드를 . 용법:

#통사론

insert () 메서드의 구문-

list.insert(index, obj)

#Parameters

  • index-이것은 객체 OBJ를 삽입해야하는 인덱스입니다.
  • OBJ-이것은 주어진 목록에 삽입 할 개체입니다.

#Return Value이 메소드는 값을 반환하지 않지만 주어진 인덱스에 주어진 요소를 삽입합니다.

예:

a = [1,2,4,5]

a.insert(2,3)

print(a)

보고 [1, 2, 3, 4, 5]


2
이것은 질문에 대한 답이 아닙니다.
Gustav Bertram

5
질문이 구체적이었습니다. Is there anyway I can get the updated list as result, instead of updating the original list in place?귀하의 답변은 그 반대입니다.
Laszlowaty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.