[python] 파이썬에서 두 목록을 어떻게 연결합니까?

파이썬에서 두 목록을 어떻게 연결합니까?

예:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

예상되는 결과:

>>> joinedlist
[1, 2, 3, 4, 5, 6]



답변

+연산자를 사용하여 다음 을 결합 할 수 있습니다.

listone = [1,2,3]
listtwo = [4,5,6]

joinedlist = listone + listtwo

산출:

>>> joinedlist
[1,2,3,4,5,6]


답변

를 사용하여 두 목록의 항목을 단순히 반복하는 생성기를 만들 수도 있습니다 itertools.chain(). 이를 통해 항목을 새 목록에 복사하지 않고 처리를 위해 목록 (또는 반복 가능 항목)을 함께 연결할 수 있습니다.

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item


답변

파이썬 >= 3.5대안 :[*l1, *l2]

PEP 448언급 할 가치가있는 다른 대안이 채택되었습니다 .

Additional Unpacking Generalizations 이라는 제목의 PEP는 일반적으로 *Python 에서 별표 표시된 표현식을 사용할 때 일부 구문 제한을 줄였습니다 . 그것으로, 두리스트를 결합하는 것 (모든 iterable에 적용)은 이제 다음과 같이 할 수 있습니다 :

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> joined_list = [*l1, *l2]  # unpack both iterables in a list literal
>>> print(joined_list)
[1, 2, 3, 4, 5, 6]

이 기능 은 Python 용으로 정의3.5 되었으며 3.x제품군의 이전 버전으로 백 포트되지 않았습니다 . 지원되지 않는 버전에서는 a SyntaxError가 올라갑니다.

다른 접근 방식과 마찬가지로 이것도 해당 목록의 요소 를 얕게 복사 합니다.


상승 이 방법은 당신이 정말로 그것을 수행하기 위해, 반복 가능 할 것입니다 아무것도하지 않아도 목록을 할 것입니다. PEP에 명시된 바와 같이 :

또한 이터 러블을 목록으로 합칠 수있는 읽기 쉬운 방법으로 유용합니다. 예를 들어 my_list + list(my_tuple) + list(my_range)just과 같습니다 [*my_list, *my_tuple, *my_range].

와 또한이 동안 그래서 +인상 것 TypeError불일치를 입력 인해를 :

l = [1, 2, 3]
r = range(4, 7)
res = l + r

다음은 그렇지 않습니다.

res = [*l, *r]

iterables의 내용을 먼저 풀고 내용에서 간단히 list내용을 작성하기 때문 입니다.


답변

집합을 사용하여 고유 한 값의 병합 된 목록을 얻을 수 있습니다.

mergedlist = list(set(listone + listtwo))


답변

다른 list.extend()방법 list의 끝에 a 를 추가하기 위해이 방법을 사용할 수도 있습니다 .

listone = [1,2,3]
listtwo = [4,5,6]

listone.extend(listtwo)

원본 목록을 그대로 유지하려면 새 list객체를 만들고 extend두 목록을 모두 만들 수 있습니다 .

mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)


답변

파이썬에서 두 목록을 어떻게 연결합니까?

3.7부터는 파이썬에서 두 개 이상의 목록을 연결하는 가장 일반적인 stdlib 방법입니다.

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

각주

  1. 간결함 때문에 매끄러운 솔루션입니다. 그러나 sum한 쌍의 방식으로 연결을 수행합니다. 이는 각 단계마다 메모리를 할당해야하기 때문에 2 차 연산임을 의미합니다. 목록이 큰 경우 사용하지 마십시오.

  2. 참조 chain

    chain.from_iterable
    워드 프로세서에서. import itertools먼저 해야합니다 . 연결은 메모리에서 선형이므로 성능 및 버전 호환성 측면에서 최고입니다. chain.from_iterable2.6에서 소개되었습니다.

  3. 이 방법은 추가 포장 풀기 일반화 (PEP 448) 를 사용하지만 직접 포장을 풀지 않으면 N 목록으로 일반화 할 수 없습니다.

  4. a += b그리고 a.extend(b)더 많거나 적은 상응하는 모든 실제적인 목적을 위해입니다. +=목록에서 호출되면 내부적으로를 호출
    list.__iadd__하여 첫 번째 목록을 두 번째 목록으로 확장합니다.


공연

2- 목록 연결 1

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

이 방법들 사이에는 큰 차이가 없지만 모두 동일한 순서의 복잡성 (선형)을 갖는 것이 의미가 있습니다. 스타일 문제를 제외하고는 다른 것을 선호 할 특별한 이유가 없습니다.

N- 목록 연결

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

플롯은 perfplot 모듈을 사용하여 생성되었습니다 . 참고로 코드입니다.

1. iadd( +=) 및 extend방법은 제자리에서 작동하므로 테스트 전에 매번 사본을 생성해야합니다. 일을 공정하게 유지하기 위해 모든 방법에는 왼쪽 목록에 대한 사전 복사 단계가 있으며 무시할 수 있습니다.


다른 솔루션에 대한 의견

  • list.__add__어떤 방식, 모양 또는 형태로도 던저 방법을 직접 사용하지 마십시오 . 실제로, Dunder 메소드를 피하고 operator설계된 것과 같은 연산자와 함수를 사용하십시오 . 파이썬은 신중한 의미론을 가지고 있는데, 이것들은 단지 던전을 직접 호출하는 것보다 복잡한 것입니다. 여기 예가 있습니다. 요약하면 a.__add__(b)=> BAD; a + b=> 좋아.

  • 여기에 일부 답변 reduce(operator.add, [a, b])은 페어 단위 연결을 제공 합니다. 이것은 sum([a, b], [])더 장황한 것과 같습니다 .

  • 사용하는 모든 방법은 set중복을 제거하고 순서를 잃습니다. 주의해서 사용하십시오.

  • for i in b: a.append(i)a.extend(b)단일 함수 호출과 관용적 인보 다 더 장황하고 느립니다 . append목록에 메모리가 할당되고 성장되는 의미론으로 인해 속도가 느려집니다. 비슷한 토론에 대해서는 여기 를 참조 하십시오 .

  • heapq.merge작동하지만 사용 사례는 정렬 된 목록을 선형 시간으로 병합하는 것입니다. 다른 상황에서 사용하는 것은 안티 패턴입니다.

  • yield함수에서 list 요소를 사용하는 것은 허용 가능한 방법이지만 chain더 빠르고 더 잘 수행합니다 (C에 코드 경로가 있으므로 빠릅니다).

  • operator.add(a, b)허용 가능한 기능은 a + b입니다. 유스 케이스는 주로 동적 메소드 디스패치에 사용됩니다. 그렇지 않으면 내 의견으로a + b 는 더 짧고 읽기 쉬운 것을 선호합니다 . YMMV.


답변

이것은 매우 간단 하며 튜토리얼 에도 나와 있다고 생각합니다 .

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]