목록 방법 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']