리스트를 튜플리스트로 병합하는 방법?


298

다음을 달성하기위한 Pythonic 접근법은 무엇입니까?

# Original lists:

list_a = [1, 2, 3, 4]
list_b = [5, 6, 7, 8]

# List of tuples from 'list_a' and 'list_b':

list_c = [(1,5), (2,6), (3,7), (4,8)]

의 각 구성원은 list_c튜플이며, 첫 번째 구성원은 출신 list_a이고 두 번째 구성원은 출신 입니다 list_b.

답변:


443

파이썬 2에서 :

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> zip(list_a, list_b)
[(1, 5), (2, 6), (3, 7), (4, 8)]

파이썬 3에서 :

>>> list_a = [1, 2, 3, 4]
>>> list_b = [5, 6, 7, 8]
>>> list(zip(list_a, list_b))
[(1, 5), (2, 6), (3, 7), (4, 8)]

77
zip 기능은 가장 짧은 목록의 끝에서 중지되므로 항상 원하는 것은 아닙니다. 이 itertools모듈은 zip_longest()가장 긴 목록의 끝에서 멈추고 누락 된 값을 매개 변수로 제공 한 값으로 채우는 메소드를 정의합니다 .
Adrien Plisson

5
@Adrien : 해당 의견을 응원합니다. 파이썬 2.x를 들어, s/zip_longest()/izip_longest(). Python 3.x에서로 이름이 변경되었습니다 zip_longest().
mechanical_meat

zip 명령을 사용하여 [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6) 등)을 만들 수 있습니까?
Mona Jalal

3
@MonaJalal : 아니요, 페어링되지 않았기 때문에 목록 의 제품 을 만듭니다 . itertools.product()것을 수행.
Martijn Pieters

2
적어도 python3.6에서 zip은 목록을 반환하지 않습니다. 따라서 대신 list (zip (list_a, list_b))가 필요합니다
Supamee

141

파이썬 3.0에서 zip은 zip 객체를 반환합니다. 를 호출하여 목록에서 목록을 얻을 수 있습니다 list(zip(a, b)).


3
이것은 사소한 일이지만 for 루프에서 직접 사용하면 발전기를 한 번 사용한 후 소진 될 수 있습니다. 더 자주 사용하려면 변수에 저장
Hakaishin

13

맵 람다를 사용할 수 있습니다

a = [2,3,4]
b = [5,6,7]
c = map(lambda x,y:(x,y),a,b)

원본 목록의 길이가 일치하지 않는 경우에도 작동합니다


1
람다를 사용하는 이유는 무엇입니까? map(None, a,b)
Padraic Cunningham 2016 년

파이썬 3.5에만 액세스 할 수 있습니다.
다크 나이트

3
python3을 사용하고 있다면 c는 목록이 아니고 맵 객체 일 것입니다. 또한 람다를 사용하는 것은 단순히 압축하는 것보다 훨씬 덜 효율적입니다. 다른 길이의 목록이 있고 처리하려는 경우 izip_longest / zip_longest
Padraic 커닝햄


6

이것이 파이썬 방식인지 아닌지는 확실하지 않지만 두 목록에 같은 수의 요소가있는 경우 단순 해 보입니다.

list_a = [1, 2, 3, 4]

list_b = [5, 6, 7, 8]

list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]

5

나는 이것이 오래된 질문이라는 것을 알고 이미 대답했지만 어떤 이유로 든 여전히이 대안 솔루션을 게시하고 싶습니다. 필요한 "마법"을 수행하는 내장 함수를 찾는 것이 쉽지만, 스스로 할 수 있다는 것을 아는 것은 아프지 않습니다.

>>> list_1 = ['Ace', 'King']
>>> list_2 = ['Spades', 'Clubs', 'Diamonds']
>>> deck = []
>>> for i in range(max((len(list_1),len(list_2)))):
        while True:
            try:
                card = (list_1[i],list_2[i])
            except IndexError:
                if len(list_1)>len(list_2):
                    list_2.append('')
                    card = (list_1[i],list_2[i])
                elif len(list_1)<len(list_2):
                    list_1.append('')
                    card = (list_1[i], list_2[i])
                continue
            deck.append(card)
            break
>>>
>>> #and the result should be:
>>> print deck
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')]

2
입력 목록 중 하나를 변경하면 (길이가 다른 경우) 부작용이 없습니다. 또한,에 두 개의 할당 card의는 if-elif당신이이 이유가 필요하지 않습니다 continue. (실제로, continue당신이 없으면 당신은 목록을 변경할 필요가 없습니다 : 앞에서 언급 한 두 과제를 모두 유지 card = (list_1[i], '')하고 card = ('', list_2[1])각각해야합니다.)
ᴠɪɴᴄᴇɴᴛ

5

문제 설명에 표시된 출력은 튜플이 아니라 목록입니다.

list_c = [(1,5), (2,6), (3,7), (4,8)]

확인

type(list_c)

list_a 및 list_b에서 결과를 튜플로 원한다고 생각하면

tuple(zip(list_a,list_b)) 

내 관점에서 볼 때, 내가 찾고있는 것 (목록과 튜플) 모두에서 잘 작동하는 것 같습니다. 당신이 사용하는 경우 때문에 인쇄 (예상 @cyborg 및 @Lodewijk에 의해 했나요로)와 관련 아무것도, 당신은 바로 값을 볼 목적 : 같은 <map object at 0x000001F266DCE5C0><zip object at 0x000002629D204C88>. 적어도 mapzip (단독) 에 대한 해결책은 불완전하거나 너무 복잡해 보입니다.
Wagner_SOFC

1
이 질문에 따르면 튜플이 아닌 튜플 목록이 필요합니다.
goryh 2016 년

1

사용하지 않는 한 가지 대안 zip:

list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]

튜플을 1st와 1st, 2nd와 2nd ...뿐만 아니라 2 목록의 가능한 모든 조합을 얻으려면 다음과 같이하십시오.

list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.