etc./StackOverFlow

Python의 목록 메서드 추가와 확장의 차이점은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 10. 26. 04:49
반응형

질문자 :Claudiu


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]


kender

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

Harley Holcombe

목록 메서드 추가와 확장의 차이점은 무엇입니까?

  • append 는 목록의 끝에 단일 요소로 인수를 추가합니다. 목록 자체의 길이가 1씩 늘어납니다.
  • extend 은 인수를 반복하여 목록에 각 요소를 추가하여 목록을 확장합니다. 목록의 길이는 iterable 인수에 있는 요소의 수만큼 증가합니다.

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)

따라서 확장을 사용하면 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 수정 현재 위치에서 목록을 (그것이 현재 위치에서 운영자이며, 우리가 보았 듯이리스트, 변경 가능한 객체)는 새로운 목록을 작성하지 않도록. 또한 두 번째 iterable은 모든 종류의 iterable이 될 수 있다는 점에서 확장과 같이 작동합니다.

혼동하지 마십시오 - my_list = my_list + another_list += 와 동일하지 않습니다. - my_list에 할당된 완전히 새로운 목록을 제공합니다.

시간 복잡도

추가는 ( 상각된 ) 일정한 시간 복잡도 , O(1)을 가집니다.

확장은 시간 복잡도 O(k)를 가집니다.

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

"상각"에 대해 - 목록 개체 구현 소스에서 :

 /* This over-allocates proportional to the list size, making room * for additional growth. The over-allocation is mild, but is * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc().

이것은 우리가 필요한 것보다 더 큰 메모리 재할당의 이점을 미리 얻을 수 있음을 의미하지만 더 큰 것으로 다음 한계 재할당에서 비용을 지불할 수 있습니다. 모든 추가에 대한 총 시간은 O(n)에서 선형이며 추가당 할당된 시간은 O(1)이 됩니다.

성능

추가를 사용하여 확장과 동일한 결과를 얻을 수 있으므로 무엇이 더 성능이 좋은지 궁금할 수 있습니다. 다음 기능은 동일한 작업을 수행합니다.

 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

타이밍에 대한 의견 다루기

한 댓글 작성자는 다음과 같이 말했습니다.

완벽한 답변, 한 요소만 추가해서 비교하는 타이밍이 그리워요

의미상 올바른 일을 하십시오. 반복 가능한 모든 요소를 추가하려면 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

그리고 단지 확장을 사용하기 위해 이터러블을 만드는 것이 (사소한) 시간 낭비라는 것을 알았습니다.

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

추가할 요소가 하나 extend 을 사용하여 얻을 수 있는 것이 없음을 여기서 알 수 있습니다.

또한 이러한 타이밍은 그다지 중요하지 않습니다. 난 그냥 가지 올바른 방법 ™하고있다, 파이썬에서 의미 올바른 일을하고있는 점을 그들에게 보여입니다.

두 개의 비교 가능한 작업에서 타이밍을 테스트하고 모호하거나 반대의 결과를 얻을 수 있습니다. 의미상 올바른 일을 하는 데만 집중하세요.

결론

이터러블의 각 요소를 목록에 추가하려는 경우 extend append 보다 훨씬 빠르게 실행할 수 있음을 알 수 있습니다.

목록에 추가할 단일 요소(이터러블이 아님)만 있는 경우에는 append 사용하십시오.


Aaron Hall

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

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

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

Greg Hewgill

추가 대 확장

여기에 이미지 설명 입력

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

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

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

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

중첩 목록을 얻으려면

확장 대신 다음과 같이 단일 요소를 확장할 수 있습니다.

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

다른 결과로 더 많은 요소 추가...

하나 이상의 요소에 대해 추가를 사용하는 경우 요소 목록을 인수로 전달해야 하며 중첩 목록을 얻을 수 있습니다!

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

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

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

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

여기에 이미지 설명 입력

여기에 이미지 설명 입력


PythonProgrammi

다음 두 스니펫은 의미상 동일합니다.

 for item in iterator: a_list.append(item)

그리고

 a_list.extend(iterator)

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


Erik

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

파이썬으로 다이빙 .


CodyChan

확장을 반환하는 데 제자리에서 확장하는 대신 "+"를 사용할 수 있습니다.

 l1=range(10) l1+[11] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11] l2=range(10,1,-1) l1+l2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2]

유사하게 += appendextend 와 약간의 차이점이 있습니다. appendextend 에서 += 의 가장 큰 차이점 중 하나는 함수 범위에서 사용되는 경우입니다. 이 블로그 게시물을 참조하세요.


denfromufa

append(object) - 목록에 개체를 추가하여 목록을 업데이트합니다.

 x = [20] # List passed to the append(object) method is treated as a single object. x.append([21, 22, 23]) # Hence the resultant list length will be 2 print(x) --> [20, [21, 22, 23]]

extend(list) - 기본적으로 두 목록을 연결합니다.

 x = [20] # The parameter passed to extend(list) method is treated as a list. # Eventually it is two lists being concatenated. x.extend([21, 22, 23]) # Here the resultant list's length is 4 print(x) [20, 21, 22, 23]

Chaitanya

+ 연산자를 사용한 appendextend 과 동일합니다.

 >>> x = [1,2,3] >>> x [1, 2, 3] >>> x = x + [4,5,6] # Extend >>> x [1, 2, 3, 4, 5, 6] >>> x = x + [[7,8]] # Append >>> x [1, 2, 3, 4, 5, 6, [7, 8]]

skdev75

extend() 는 반복자 인수와 함께 사용할 수 있습니다. 다음은 예입니다. 다음과 같은 방법으로 목록 목록에서 목록을 만들고 싶습니다.

에서

 list2d = [[1,2,3],[4,5,6], [7], [8,9]]

당신이 원하는

 >>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

itertools.chain.from_iterable() 을 사용하여 그렇게 할 수 있습니다. 이 메서드의 출력은 반복자입니다. 그 구현은 다음과 같습니다.

 def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> ABCDEF for it in iterables: for element in it: yield element

우리의 예로 돌아가서, 우리는 할 수 있습니다

 import itertools list2d = [[1,2,3],[4,5,6], [7], [8,9]] merged = list(itertools.chain.from_iterable(list2d))

원하는 목록을 가져옵니다.

다음은 extend() 동등하게 사용할 수 있는 방법입니다.

 merged = [] merged.extend(itertools.chain.from_iterable(list2d)) print(merged) >>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

kiriloff

append() : 기본적으로 파이썬에서 하나의 요소를 추가하는 데 사용됩니다.

예 1:

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

예 2:

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

확장() : 확장()은 두 목록을 병합하거나 하나의 목록에 여러 요소를 삽입하는 데 사용됩니다.

예 1:

 >> a = [1, 2, 3, 4] >> b = [5, 6, 7, 8] >> a.extend(b) >> print(a) >> a = [1, 2, 3, 4, 5, 6, 7, 8]

예 2:

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

The Gr8 Adakron

암시되었지만 설명되지 않은 흥미로운 점은 확장이 추가보다 빠르다는 것입니다. 내부에 추가가 있는 루프의 경우 list.extend(processed_elements)로 대체되는 것으로 간주해야 합니다.

새 요소를 추가하면 전체 목록이 메모리의 더 나은 위치에 재할당될 수 있음을 명심하십시오. 한 번에 하나의 요소를 추가하기 때문에 이 작업을 여러 번 수행하면 전체 성능이 저하됩니다. 이러한 의미에서 list.extend는 "".join(stringlist)과 유사합니다.


bconstanzo

추가는 전체 데이터를 한 번에 추가합니다. 전체 데이터가 새로 생성된 인덱스에 추가됩니다. 반면에 extend 은 이름에서 알 수 있듯이 현재 배열을 확장합니다.

예를 들어

 list1 = [123, 456, 678] list2 = [111, 222]

append 우리는 다음을 얻습니다.

 result = [123, 456, 678, [111, 222]]

extend 하는 동안 우리는 다음을 얻습니다.

 result = [123, 456, 678, 111, 222]

Shiv

영어 사전은 단어 appendextend 을 다음과 같이 정의합니다.

append : 작성된 문서의 끝에 (무엇을) 추가합니다.
확장 : 더 크게 만듭니다. 확대 또는 확장


그 지식을 가지고 이제 이해합시다.

1) appendextend 의 차이점

append :

  • 모든 Python 객체를 있는 그대로 목록의 끝에 추가합니다(즉, 목록의 마지막 요소로).
  • 결과 목록은 중첩될 수 있으며 이기종 요소(예: 목록, 문자열, 튜플, 사전, 집합 등)를 포함할 수 있습니다.

extend :

  • 모든 iterable 을 인수로 허용하고 목록을 더 크게 만듭니다.
  • list(iterable) 를 적용한 결과 이 목록에 이기종 요소(예: 문자, 정수, 부동 소수점)가 포함될 수 있습니다.

2) appendextend 유사성

  • 둘 다 정확히 하나의 인수를 취합니다.
  • 둘 다 목록 을 제자리에서 수정합니다.
  • 결과적으로 둘 다 None 반환합니다.

예시

 lis = [1, 2, 3] # 'extend' is equivalent to this lis = lis + list(iterable) # 'append' simply appends its argument as the last element to the list # as long as the argument is a valid Python object list.append(object)

kmario23

이 질문에 대한 유용한 보충 자료를 만들 수 있기를 바랍니다. 목록에 특정 유형의 개체(예: Info )가 저장되어 있는 경우 다음과 같은 상황에서 extend 메서드가 적합하지 않습니다. for 루프에서 Info 개체를 extend 을 사용하여 목록에 저장하면 실패합니다. 예외는 아래와 같습니다.

TypeError: 'Info' 개체는 반복할 수 없습니다.

append 메서드를 사용하면 결과는 괜찮습니다. extend 메서드를 사용할 때마다 항상 목록이나 다른 컬렉션 유형으로 처리하고 반복하고 이전 목록 뒤에 배치하기 때문입니다. 특정 객체는 당연히 반복될 수 없습니다.


Crabime

직관적으로 구별하기 위해

 l1 = ['a', 'b', 'c'] l2 = ['d', 'e', 'f'] l1.append(l2) l1 ['a', 'b', 'c', ['d', 'e', 'f']]

l1 그녀의 몸(중첩) 안에 몸을 재생산하는 것과 같습니다.

 # Reset l1 = ['a', 'b', 'c'] l1.extend(l2) l1 ['a', 'b', 'c', 'd', 'e', 'f']

헤어진 두 사람이 결혼하여 한 가족을 이루는 것과 같다.

게다가 나는 당신의 참조를 위해 모든 목록의 방법에 대한 철저한 치트 시트를 만듭니다.

 list_methods = {'Add': {'extend', 'append', 'insert'}, 'Remove': {'pop', 'remove', 'clear'} 'Sort': {'reverse', 'sort'}, 'Search': {'count', 'index'}, 'Copy': {'copy'}, }

AbstProcDo

extend(L) L 의 모든 항목을 추가하여 목록을 확장합니다.

 >>> a [1, 2, 3] a.extend([4]) #is eqivalent of a[len(a):] = [4] >>> a [1, 2, 3, 4] a = [1, 2, 3] >>> a [1, 2, 3] >>> a[len(a):] = [4] >>> a [1, 2, 3, 4]

tessie

append 는 (인수로서) 전달된 단일 객체, 단 하나의 항목에 의해 목록(제자리에서)을 "확장"합니다.

extend 은 전달된 객체(인수로서)가 포함하는 만큼의 항목만큼 목록(제자리에서)을 "확장"합니다.

str 객체에 대해 약간 혼란스러울 수 있습니다.

  1. 문자열을 인수로 전달하면 append 는 끝에 단일 문자열 항목을 extend 은 해당 문자열의 길이만큼 "단일" 'str' 항목을 추가합니다.
  2. 문자열 목록을 인수로 전달하면 append 는 여전히 끝에 단일 '목록' 항목을 extend 은 전달된 목록의 길이만큼 많은 '목록' 항목을 추가합니다.
 def append_o(a_list, element): a_list.append(element) print('append:', end = ' ') for item in a_list: print(item, end = ',') print() def extend_o(a_list, element): a_list.extend(element) print('extend:', end = ' ') for item in a_list: print(item, end = ',') print() append_o(['ab'],'cd') extend_o(['ab'],'cd') append_o(['ab'],['cd', 'ef']) extend_o(['ab'],['cd', 'ef']) append_o(['ab'],['cd']) extend_o(['ab'],['cd'])

생산:

 append: ab,cd, extend: ab,c,d, append: ab,['cd', 'ef'], extend: ab,cd,ef, append: ab,['cd'], extend: ab,cd,

ilias iliadis

추가 및 확장은 파이썬의 확장성 메커니즘 중 하나입니다.

추가: 목록 끝에 요소를 추가합니다.

 my_list = [1,2,3,4]

목록에 새 요소를 추가하려면 다음과 같은 방식으로 append 메서드를 사용할 수 있습니다.

 my_list.append(5)

새 요소가 추가될 기본 위치는 항상 (길이+1) 위치입니다.

삽입: 추가의 한계를 극복하기 위해 삽입 방법을 사용했습니다. 삽입을 사용하면 새 요소를 삽입할 정확한 위치를 명시적으로 정의할 수 있습니다.

삽입(인덱스, 개체)의 메서드 설명자. 두 개의 인수가 필요합니다. 첫 번째는 요소를 삽입하려는 인덱스이고 두 번째는 요소 자체입니다.

 Example: my_list = [1,2,3,4] my_list[4, 'a'] my_list [1,2,3,4,'a']

확장: 두 개 이상의 목록을 단일 목록으로 결합하려는 경우 매우 유용합니다. 확장하지 않고 두 목록을 결합하려는 경우 결과 개체에는 목록 목록이 포함됩니다.

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

pos 2에 있는 요소에 액세스하려고 하면 요소 대신 목록([3])을 얻습니다. 두 목록을 결합하려면 append를 사용해야 합니다.

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

여러 목록을 결합하려면

 a = [1] b = [2] c = [3] a.extend(b+c) print (a) [1,2,3]

vivek

출처 : http:www.stackoverflow.com/questions/252703/what-is-the-difference-between-pythons-list-methods-append-and-extend

반응형