programing

Python의 목록 메서드 append와 extend의 차이점은 무엇입니까?

shortcode 2023. 1. 28. 09:52
반응형

Python의 목록 메서드 append와 extend의 차이점은 무엇입니까?

방식의 append() ★★★★★★★★★★★★★★★★★」extend()

append 는 목록의 끝에 지정된 개체를 추가합니다.

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

extend 는 지정된 반복 가능한 요소를 추가하여 목록을 확장합니다.

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

append목록에 요소를 추가합니다. extend는 첫 번째 목록을 다른 목록/반복 가능 목록과 연결합니다.

>>> xs = ['A', 'B']
>>> xs
['A', 'B']

>>> xs.append("D")
>>> xs
['A', 'B', 'D']

>>> xs.append(["E", "F"])
>>> xs
['A', 'B', 'D', ['E', 'F']]

>>> xs.insert(2, "C")
>>> xs
['A', 'B', 'C', 'D', ['E', 'F']]

>>> xs.extend(["G", "H"])
>>> xs
['A', 'B', 'C', 'D', ['E', 'F'], 'G', 'H']

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

  • 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하여 목록을 확장합니다.

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

오버로드, "Overload",__add__ )+ 및 )의 개요__iadd__ )+=)

다.+ ★★★★★★★★★★★★★★★★★」+=는 '하다'에 정의되어 .list 이치노

my_list + another_list그럼 메모리에 세 번째 목록이 생성되므로 결과를 반환할 수 있지만 두 번째 반복 가능한 목록이 필요합니다.

my_list += another_list는 리스트를 in-place(in-place 연산자이며, 리스트는 변경 가능한 오브젝트)로 변경하기 때문에 새로운 리스트는 작성되지 않습니다.두 번째 반복은 어떤 종류의 반복도 가능하다는 점에서 확장과 같이 작동합니다.

my_list = my_list + another_list is is is+=my_list에 할당된

시간의 복잡성

Append에는 일정한 시간 복잡도 O(1)가 있습니다.

연장은 시간이 복잡합니다. O(k)

을 통해 ""로 합니다.append는 복잡함을 가중시켜 확장과 동등하게 하고 확장의 반복은 C에서 구현되므로 반복 가능한 항목에서 목록에 연속 항목을 추가하는 것이 항상 빠릅니다.

리스트 오브젝트 실장 소스로부터의 "amortized"에 대해서:

    /* 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)가 됩니다.

성능

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

타이밍에 대한 코멘트의 수신처 지정

해설자는 다음과 같이 말했다.

완벽한 답변입니다. 단지 하나의 요소만 추가하는 비교 타이밍을 놓쳤을 뿐입니다.

의미론적으로 올바른 작업을 수행합니다. 가능한로 추가할 를 합니다.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추가할 요소가 하나밖에 없을 때 말이죠.

또한 이러한 타이밍은 그다지 중요하지 않습니다.Python에서는 의미론적으로 올바른 작업을 수행하는 것이 올바른 방법™이라는 점을 강조하기 위한 것입니다.

비교 가능한 두 가지 연산에 대해 타이밍을 테스트하여 애매하거나 반대의 결과를 얻을 수 있습니다.의미론적으로 올바른 일을 하는 데만 집중하세요.

결론

되어 있는 것을 알 수 있습니다.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]

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

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

두 가지 방법을 모두 사용하여 하나의 요소 추가

여기에 이미지 설명 입력

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

요소 1개 추가

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

하나의 요소를 확장하다

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

요소를 추가하는 중...다른 결과를 낳다

여러 요소에 대해 추가를 사용하는 경우 요소 목록을 인수로 전달해야 합니다. 그러면 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를 사용하여 항목이 더 많은 목록을 가져옵니다.그러나 목록을 추가하면 목록에 요소가 추가되는 것이 아니라 코드 출력에서 알 수 있듯이 중첩된 목록인 요소가 하나 추가됩니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

다음 2개의 스니펫은 의미상 동등합니다.

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

Dive Into Python에서.

원래대로 연장하는 대신 반환 연장에는 "+"를 사용할 수 있습니다.

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]

로, 하 similarly similarly+=행동을 위해 with 하지만 리 자 서 동 해 간 for,있 behavior차약,가 place diffe in다rences의 but from위이나행제 slight에의을그러, behavior for placeappend&&extend. . One of the biggest differences of 가장 큰 차이점 중 하나는+=부에서append and 그리고.extend함수 범위에서 사용되는 경우 이 블로그 게시물을 참조하십시오.

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)두 개의 목록을 정렬합니다.2번입니다.

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]

은 것은은 this this this this this this this this this에 해당합니다.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]]

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']) --> A B C D E F
    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()는 interpreter 사용할 수 .interpreter interprator 는 interpreter 입니다.

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

append():기본적으로 Python에서 하나의 요소를 추가하기 위해 사용됩니다.

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

extend():여기서 extend()는 2개의 목록을 Marge하거나 1개의 목록에 여러 요소를 삽입하기 위해 사용합니다.

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

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

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

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

예를들면

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

★★★★★★★★★★★★★★★★ append을 사용하다

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

★★★★★★★★★★★★★★★★★★★★★extend을 사용하다

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

에는 어어사 the the the the the the the the the the the the the라는 단어가 정의되어 .append ★★★★★★★★★★★★★★★★★」extend같이요.

append: 문서 끝에 (뭔가를) 추가합니다.
확장: 더 크게 만듭니다.확대 또는 확장


그 지식을 바탕으로 이제 이해합시다.

1) 와의 차이

다음과 같습니다append.

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

다음과 같습니다extend.

  • 반복 가능한 모든 항목을 인수로 받아들여 목록을 더 크게 만듭니다.
  • 결과 네스트 이며, 를 한 결과,그에 이종 요소(예를 들면 플로트.list(iterable).

2) 와의 유사성

  • 둘 다 정확히 하나의 주장을 받아들인다.
  • 둘 다 목록을 일괄적으로 수정합니다.
  • 양쪽 반환됩니다.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)

이 질문에 도움이 될 만한 보충 자료가 되었으면 합니다.에 특정 가 저장되어 있는 (예: " " ).Infoextend방법이 적절하지 않습니다.①의 for 및 에 대해 합니다.Info 사용하고 .extend이치노을 사용하다

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

,을 append 결과는 OK.method, OK. 매번 RPM을 할 extend메서드는 항상 목록 또는 다른 수집 유형으로 처리하여 반복하고 이전 목록 뒤에 배치합니다.특정 개체를 반복할 수 없습니다.

직감적으로 구별하다

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'},
                }

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]

append리스트는 1개의 항목(인수로서 전달된)으로 「수정」됩니다.

extend전달된 개체(인수)에 포함된 항목 수만큼 목록을 "제자리"합니다.

은 약간 수 .str★★★★★★★★★★★★★★★★★★.

  1. 로서 문자열을:append는 끝에 합니다.단, 스트링 항목은 "예"로 지정합니다.extend'싱글' '스트' '스트레' 。
  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,

추가 및 확장은 비단뱀의 확장성 메커니즘 중 하나입니다.

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

my_list = [1,2,3,4]

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

my_list.append(5)

새 요소가 추가되는 기본 위치는 항상 (length+1) 위치에 있습니다.

Insert : append의 한계를 극복하기 위해 insert 메서드를 사용했습니다.삽입을 사용하면 새 요소를 삽입할 정확한 위치를 명시적으로 정의할 수 있습니다.

삽입(인덱스, 객체)의 메서드 기술자입니다.여기에는 두 가지 인수가 필요합니다.첫 번째는 요소를 삽입하는 인덱스이고 두 번째는 요소 자체입니다.

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]

언급URL : https://stackoverflow.com/questions/252703/what-is-the-difference-between-pythons-list-methods-append-and-extend

반응형