[python] 파이썬의리스트 메소드 append와 extend의 ​​차이점은 무엇입니까?

목록 방법 append()과 차이점은 무엇입니까 extend()?



답변

append: 끝에 오브젝트를 추가합니다.

x = [1, 2, 3]
x.append([4, 5])
print (x)

당신에게 제공합니다 : [1, 2, 3, [4, 5]]


extend: iterable에서 요소를 추가하여 목록을 확장합니다.

x = [1, 2, 3]
x.extend([4, 5])
print (x)

당신에게 제공합니다 : [1, 2, 3, 4, 5]


답변

append요소를 목록에 추가 extend하고 첫 번째 목록을 다른 목록 (또는 목록이 아닌 다른 반복 가능 항목)과 연결합니다.

>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']

>>> li.append("new")
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']

>>> li.append(["new", 2])
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.insert(2, "new")
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2]]

>>> li.extend(["two", "elements"])
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', ['new', 2], 'two', 'elements']


답변

추가 및 확장 목록 방법의 차이점은 무엇입니까?

  • append인수를 목록 끝에 단일 요소로 추가합니다. 목록 자체의 길이는 1 씩 증가합니다.
  • extend인수를 반복하여 각 요소를 목록에 추가하고 목록을 확장합니다. 목록의 길이는 반복 가능한 인수에 많은 요소가 있었을 때 증가합니다.

append

list.append메소드는 객체를 목록의 끝에 추가합니다.

my_list.append(object) 

개체가 숫자, 문자열, 다른 목록 또는 기타 무엇이든 관계없이 목록 my_list의 단일 항목으로 끝에 추가 됩니다.

>>> my_list
['foo', 'bar']
>>> my_list.append('baz')
>>> my_list
['foo', 'bar', 'baz']

따라서 목록은 객체라는 것을 명심하십시오. 목록에 다른 목록을 추가하면 첫 번째 목록은 목록 끝에 단일 객체가됩니다 (원하는 것이 아닐 수도 있음).

>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
                     #^^^^^^^^^--- single item at the end of the list.

extend

list.extend메소드는 iterable에서 요소를 추가하여 목록을 확장합니다.

my_list.extend(iterable)

따라서 extend와 함께 iterable의 각 요소가 목록에 추가됩니다. 예를 들면 다음과 같습니다.

>>> my_list
['foo', 'bar']
>>> another_list = [1, 2, 3]
>>> my_list.extend(another_list)
>>> my_list
['foo', 'bar', 1, 2, 3]

문자열은 반복 가능하므로 문자열로 목록을 확장하면 문자열을 반복 할 때 각 문자를 추가합니다 (원하는 것이 아닐 수도 있음).

>>> my_list.extend('baz')
>>> my_list
['foo', 'bar', 1, 2, 3, 'b', 'a', 'z']

연산자 과부하, __add__( +) 및 __iadd__( +=)

모두 ++=연산자에 대해 정의된다 list. 그것들은 의미 상 확장이 비슷합니다.

my_list + another_list 메모리에 세 번째 목록을 작성하므로 결과를 리턴 할 수 있지만 두 번째 iterable은 목록이어야합니다.

my_list += another_list수정 목록에 장소 (그것은 이다 인플레 이스 (in-place) 운영자, 그리고 우리가 보았 듯이 목록, 변경 가능한 객체)는 새로운 목록을 작성하지 않도록. 두 번째 iterable은 모든 종류의 iterable이 될 수 있다는 점에서 extend처럼 작동합니다.

혼동하지 마십시오. my_list = my_list + another_list이에 해당 하지 않습니다 +=. my_list에 지정된 새 목록을 제공합니다.

시간 복잡성

Append는 일정한 시간 복잡도를 갖습니다 (O (1)).

Extend에는 시간이 복잡합니다 (O (k)).

다중 호출을 반복 append하여 복잡성 을 추가하여 확장과 동일하게 만들고 확장 반복이 C로 구현되므로 반복 가능한 항목의 목록에 반복 가능한 항목을 추가하려는 경우 항상 더 빠릅니다.

공연

append를 사용하여 extend와 동일한 결과를 얻을 수 있으므로 성능이 더 뛰어난 것이 궁금 할 수 있습니다. 다음과 같은 기능이 동일합니다.

def append(alist, iterable):
    for item in iterable:
        alist.append(item)

def extend(alist, iterable):
    alist.extend(iterable)

그럼 시간을 보자.

import timeit

>>> min(timeit.repeat(lambda: append([], "abcdefghijklmnopqrstuvwxyz")))
2.867846965789795
>>> min(timeit.repeat(lambda: extend([], "abcdefghijklmnopqrstuvwxyz")))
0.8060121536254883

타이밍에 대한 의견을 제시

한 논평자는 말했다 :

완벽한 대답, 나는 단지 하나의 요소를 추가하는 것을 비교하는 타이밍을 그리워합니다.

의미 적으로 올바른 일을하십시오. iterable에 모든 요소를 ​​추가하려면을 사용하십시오 extend. 하나의 요소 만 추가하는 경우을 사용하십시오 append.

자, 이것이 시간 내에 어떻게 작동하는지 실험을 만들어 봅시다.

def append_one(a_list, element):
    a_list.append(element)

def extend_one(a_list, element):
    """creating a new list is semantically the most direct
    way to create an iterable to give to extend"""
    a_list.extend([element])

import timeit

그리고 우리는 확장을 사용하기 위해 iterable을 만드는 길을 벗어나는 것이 (소액의) 시간 낭비라는 것을 알았습니다.

>>> min(timeit.repeat(lambda: append_one([], 0)))
0.2082819009956438
>>> min(timeit.repeat(lambda: extend_one([], 0)))
0.2397019260097295

우리는 이것으로부터 추가 할 요소가 하나extend 밖에 없을 때 사용 하면 얻을 수있는 것이 없다는 것을 배웁니다 .

또한 이러한 타이밍은 그다지 중요하지 않습니다. 파이썬에서 의미 론적으로 올바른 일을하는 것이 Right Way ™를 하는 것임을 지적하기 위해 그것들을 보여주고 있습니다 .

두 개의 비교 가능한 작업에서 타이밍을 테스트하고 모호하거나 역의 결과를 얻을 수 있습니다. 의미 적으로 올바른 일에 집중하십시오.

결론

우리는 볼 extend훨씬보다 더 빨리 실행할 수 있습니다 의미 명확하고 있음을 append, 당신이 목록에 반복자의 각 요소를 추가하고자 할 때.

목록에 추가 할 단일 요소 (반복 가능하지 않은 요소) 만있는 경우을 사용하십시오 append.


답변

append단일 요소를 추가합니다. extend요소 목록을 추가합니다.

추가 할 목록을 전달하면 여전히 하나의 요소가 추가됩니다.

>>> a = [1, 2, 3]
>>> a.append([4, 5, 6])
>>> a
[1, 2, 3, [4, 5, 6]]


답변

추가 대 확장

여기에 이미지 설명을 입력하십시오

append를 사용하면 목록을 확장 할 단일 요소를 추가 할 수 있습니다.

>>> a = [1,2]
>>> a.append(3)
>>> a
[1,2,3]

하나 이상의 엘레멘트 또는 하나의 요소 목록 만 추가 할 수 있으므로 둘 이상의 요소를 확장하려면 extend를 사용해야합니다.

>>> a.append([4,5])
>>> a
>>> [1,2,3,[4,5]]

중첩 목록을 얻을 수 있도록

대신 extend를 사용하면 이와 같은 단일 요소를 확장 할 수 있습니다

>>> a = [1,2]
>>> a.extend([3])
>>> a
[1,2,3]

또는 추가와 달리 목록을 원래 목록에 중첩하지 않고 한 번에 더 많은 요소를 확장합니다 (이름이 확장 된 이유).

>>> a.extend([4,5,6])
>>> a
[1,2,3,4,5,6]

두 가지 방법으로 하나의 요소 추가

여기에 이미지 설명을 입력하십시오

추가와 확장 모두 목록 끝에 하나의 요소를 추가 할 수 있지만 추가는 더 간단합니다.

요소 1 개 추가

>>> x = [1,2]
>>> x.append(3)
>>> x
[1,2,3]

하나의 요소를 확장

>>> x = [1,2]
>>> x.extend([3])
>>> x
[1,2,3]

더 많은 요소 추가 … 다른 결과

둘 이상의 요소에 append를 사용하면 요소 목록을 인수로 전달해야하며 NESTED 목록을 얻을 수 있습니다!

>>> x = [1,2]
>>> x.append([3,4])
>>> x
[1,2,[3,4]]

대신 extend를 사용하면 목록을 인수로 전달하지만 이전 요소에 중첩되지 않은 새 요소가 포함 된 목록을 얻게됩니다.

>>> z = [1,2]
>>> z.extend([3,4])
>>> z
[1,2,3,4]

따라서 더 많은 요소가 있으면 extend를 사용하여 더 많은 항목이있는 목록을 얻습니다. 그러나 목록을 추가하면 목록에 더 많은 요소가 추가되지 않지만 코드 출력에서 ​​명확하게 볼 수 있듯이 중첩 목록 인 요소 하나가 추가됩니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


답변

다음 두 스 니펫은 의미 적으로 동일합니다.

for item in iterator:
    a_list.append(item)

a_list.extend(iterator)

루프가 C로 구현되면 후자가 더 빠를 수 있습니다.


답변

append()메소드는 단일 항목을 목록 끝에 추가합니다.

x = [1, 2, 3]
x.append([4, 5])
x.append('abc')
print(x)
# gives you
[1, 2, 3, [4, 5], 'abc']

extend()메소드는 하나의 인수 인 목록을 가져 와서 인수의 각 항목을 원래 목록에 추가합니다. (목록은 클래스로 구현됩니다. 목록을“만드는”것은 실제로 클래스를 인스턴스화하는 것입니다. 따라서 목록에는 작동하는 메소드가 있습니다.)

x = [1, 2, 3]
x.extend([4, 5])
x.extend('abc')
print(x)
# gives you
[1, 2, 3, 4, 5, 'a', 'b', 'c']

파이썬 에서 다이빙으로 .