append()
와 extend()
의 차이점은 무엇입니까?
질문자 :Claudiu
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]
유사하게 +=
append
및 extend
와 약간의 차이점이 있습니다. append
및 extend
에서 +=
의 가장 큰 차이점 중 하나는 함수 범위에서 사용되는 경우입니다. 이 블로그 게시물을 참조하세요.
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
+
연산자를 사용한 append
및 extend
과 동일합니다.
>>> 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
영어 사전은 단어 append
및 extend
을 다음과 같이 정의합니다.
append : 작성된 문서의 끝에 (무엇을) 추가합니다.
확장 : 더 크게 만듭니다. 확대 또는 확장
그 지식을 가지고 이제 이해합시다.
1) append
와 extend
의 차이점
append
:
- 모든 Python 객체를 있는 그대로 목록의 끝에 추가합니다(즉, 목록의 마지막 요소로).
- 결과 목록은 중첩될 수 있으며 이기종 요소(예: 목록, 문자열, 튜플, 사전, 집합 등)를 포함할 수 있습니다.
extend
:
- 모든 iterable 을 인수로 허용하고 목록을 더 크게 만듭니다.
-
list(iterable)
를 적용한 결과 이 목록에 이기종 요소(예: 문자, 정수, 부동 소수점)가 포함될 수 있습니다.
2) append
와 extend
유사성
- 둘 다 정확히 하나의 인수를 취합니다.
- 둘 다 목록 을 제자리에서 수정합니다.
- 결과적으로 둘 다
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
객체에 대해 약간 혼란스러울 수 있습니다.
- 문자열을 인수로 전달하면
append
는 끝에 단일 문자열 항목을extend
은 해당 문자열의 길이만큼 "단일" 'str' 항목을 추가합니다. - 문자열 목록을 인수로 전달하면
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
'etc. > StackOverFlow' 카테고리의 다른 글
Android에서 활동 시작 시 EditText가 포커스를 얻지 못하도록 하는 방법 (0) | 2021.10.26 |
---|---|
텍스트 영역의 크기 조정 가능한 속성을 어떻게 비활성화합니까? (0) | 2021.10.26 |
Pandas에서 DataFrame의 행을 반복하는 방법 (0) | 2021.10.26 |
정의되지 않은 객체 속성 감지 (0) | 2021.10.26 |
SQL Server의 기존 테이블에 기본값이 있는 열 추가 (0) | 2021.10.26 |