튜플 대신 목록 출력으로 압축


94

두 목록의 목록을 수행하는 가장 빠르고 우아한 방법은 무엇입니까?

나는 가지고있다

In [1]: a=[1,2,3,4,5,6]

In [2]: b=[7,8,9,10,11,12]

In [3]: zip(a,b)
Out[3]: [(1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12)]

그리고 나는 갖고 싶다

In [3]: some_method(a,b)
Out[3]: [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]

zip 대신 map을 사용하려고 생각했지만 첫 번째 인수로 넣을 표준 라이브러리 메서드가 있는지 모르겠습니다.

나는 이것을 위해 내 자신의 기능을 정의하고 맵을 사용할 수 있습니다. 제 질문은 이미 구현 된 것이 있는지입니다. 아니오 도 대답입니다.


1
글쎄요, 정말 목록 이 필요한 가요? 결과로 무엇을 하시겠습니까?
Karl Knechtel 2011

14
이러한 방식으로 데이터를 여러 번 구성해야하는 sklearn을 예로들 수 있습니다.
tumultous_rooster 2013

답변:


101

2 개 이상의 목록 (또는 2 개만)을 압축하는 경우 읽기 쉬운 방법은 다음과 같습니다.

[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]

이것은 목록 이해력을 사용하고 목록의 각 요소 (튜플)를 목록으로 변환합니다.


54

당신은 거의 답을 얻었습니다. map대신 사용하지 마십시오 zip. map AND를 사용하십시오 zip.

우아하고 기능적인 접근 방식을 위해 zip과 함께지도를 사용할 수 있습니다.

list(map(list, zip(a, b)))

zip튜플 목록을 반환합니다. 목록의 각 튜플을 map(list, [...])호출 list합니다. list(map([...])지도 객체를 읽을 수있는 목록으로 바꿉니다.


불행히도 파이썬 3 컬렉션 작업이 a를 반환하도록 결정하면 여기에 generator두 배의 비용이 부과 list됩니다.
StephenBoesch

15

나는 zip 함수의 우아함을 좋아하지만 연산자 모듈에서 itemgetter () 함수를 사용하는 것이 훨씬 더 빠른 것 같습니다. 이것을 테스트하기 위해 간단한 스크립트를 작성했습니다.

import time
from operator import itemgetter

list1 = list()
list2 = list()
origlist = list()
for i in range (1,5000000):
        t = (i, 2*i)
        origlist.append(t)

print "Using zip"
starttime = time.time()
list1, list2 = map(list, zip(*origlist))
elapsed = time.time()-starttime
print elapsed

print "Using itemgetter"
starttime = time.time()
list1 = map(itemgetter(0),origlist)
list2 = map(itemgetter(1),origlist)
elapsed = time.time()-starttime
print elapsed

zip이 더 빠를 것으로 예상했지만 itemgetter 메서드가 장기적으로 승리합니다.

Using zip
6.1550450325
Using itemgetter
0.768098831177

2
이것은 OP가하려는 일의 전치입니다. 이를 반영하도록 게시물을 업데이트 할 수 있습니까? 즉, OP는 두 목록을 목록 또는 임의의 쌍 수로 변환합니다. 임의의 수의 쌍을 한 쌍의 목록으로 변환하고 있습니다.
Mad Physicist

이것은 어떤 파이썬 버전으로 측정됩니까?
Moberg

기억이 나지 않습니다. 2 년이 넘었지만 2.6 또는 2.7 일 가능성이 높습니다. 코드를 복사하여 자신의 버전 / 플랫폼에서 사용해 볼 수 있다고 생각합니다.
kslnet

2
파이썬 2 zip는 실제 목록을 만듭니다. 속도가 느려집니다. 교체 시도 zipitertools.izip다음.
Jean-François Fabre

Python 3.5에서 zip은 3.5 초, itemgetter는 0.10 초가 걸립니다. 지능형리스트를 좋아 사람들을 위해, list1 = [x[0] for x in origlist]만큼이나 잘 작동합니다 list1 = map(itemgetter(0), origlist).
Elias Strehle 2018

3

나는 일반적으로 람다를 사용하는 것을 좋아하지 않지만 ...

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = lambda a, b: [list(c) for c in zip(a, b)]
>>> c(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

추가 속도가 필요한 경우지도가 약간 더 빠릅니다.

>>> d = lambda a, b: map(list, zip(a, b))
>>> d(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

그러나 맵은 비 파이썬으로 간주되며 성능 조정에만 사용해야합니다.


4
lambda여기에 무엇을 추가합니까? 함수를 호출하는 대신 표현식을 작성할 수 있으며 (정말 복잡하지 않음) 함수를 원하더라도 두 줄로 고통없이 정의 할 수 있습니다 (반환 키가 손상되었거나 제정신이 아닌 경우 하나). . map반면에 첫 번째 인수가 일반 함수 (a 반대 lambda) 이면 완벽하게 괜찮습니다 .

1
그는 기능을 요청했습니다. 하지만 동의합니다. 추가 비용을 지불하는 것이 좋습니다. 지도에 관해서는 목록 이해가 거의 항상 더 명확하다고 생각합니다.
Ceasar Bautista 2011

1
나는 map이상 추천 할 것 lambda입니다. 그래서 map(list, zip(a,b)). 목록 이해는 조금 더 명확 할 수 있지만 맵은 더 빠를 것입니다 (예상되지 않음)
inspectorG4dget 2011

다시 말하지만, OP에 속도가 필요하다면지도가 갈 길이다. 그러나 일반적으로 특히 Python에서는 속도보다 가독성을 강조합니다 (그렇지 않으면 조기 최적화에 빠져들게됩니다).
Ceasar Bautista 2011

3

이건 어때?

>>> def list_(*args): return list(args)

>>> map(list_, range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]

또는 더 나은 방법 :

>>> def zip_(*args): return map(list_, *args)
>>> zip_(range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]

여기에서는 zip을 수행하지 않고 목록을 직접 생성하여 한 단계를 줄이고 있으므로 나머지보다 더 나은 대답으로 보입니다. Awesome
Akshay Hazari 2015

2

numpy 사용

우아함의 정의는 매우 의심 스러울 수 있지만 numpy배열 생성 및 목록으로의 변환 (필요한 경우 ...)으로 작업하는 경우 map함수 또는 목록 이해를 사용하는 것과 비교할 때 그다지 효율적이지 않더라도 매우 실용적 일 수 있습니다 .

import numpy as np 
a = b = range(10)
zipped = zip(a,b)
result = np.array(zipped).tolist()
Out: [[0, 0],
 [1, 1],
 [2, 2],
 [3, 3],
 [4, 4],
 [5, 5],
 [6, 6],
 [7, 7],
 [8, 8],
 [9, 9]]

그렇지 않으면 zip함수를 건너 뛰면 직접 사용할 수 있습니다 np.dstack.

np.dstack((a,b))[0].tolist()

1

목록 이해는 내가 생각하기에 매우 간단한 해결책이 될 것입니다.

a=[1,2,3,4,5,6]

b=[7,8,9,10,11,12]

x = [[i, j] for i, j in zip(a,b)]

print(x)

output : [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.