튜플 대신 목록 출력이 있는 Zip
두 목록의 목록을 가장 빠르고 우아한 방법은 무엇입니까?
있습니다
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을 사용할까 생각 중이었는데, 첫 번째 주장으로 내세울 만한 표준 라이브러리 방법이 있는지 모르겠습니다.
저는 이것을 위해 제 기능을 정의할 수 있고, 지도를 사용할 수 있습니다. 제 질문은 이미 구현된 것이 있는지 여부입니다.아니오도 답입니다.
두 개 이상의 목록(또는 해당 목록의 경우 두 개만)을 지우는 경우, 읽을 수 있는 방법은 다음과 같습니다.
[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]
이것은 목록 이해를 사용하여 목록의 각 요소(튜플)에 적용하고 목록으로 변환합니다.
당신은 거의 스스로 답을 얻었습니다.사용 안 함map
대신에zip
.사용하다map
그리고. zip
.
맵과 zip을 함께 사용하여 우아하고 기능적인 접근을 할 수 있습니다.
list(map(list, zip(a, b)))
zip
튜플 목록을 반환합니다. map(list, [...])
호출들list
목록의 각 튜플에 있습니다. list(map([...])
지도 개체를 읽을 수 있는 목록으로 변환합니다.
저는 지퍼 기능의 우아함을 좋아하지만, 오퍼레이터 모듈에서 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이 더 빠를 것으로 예상했지만, 아이템 게터 방법은 승산이 없습니다.
Using zip
6.1550450325
Using itemgetter
0.768098831177
이건 어때?
>>> 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]]
Python 3용 업데이트: Python 3 맵에서는 목록이 아닌 반복기를 반환합니다.테스트한 몇 가지 옵션 중에서 가장 빠릅니다(사용 시간:timeit
모듈):
[list(t) for t in zip(*lists)]
일반적으로 람다를 사용하는 것을 좋아하지는 않지만,
>>> 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]]
그러나 맵은 비정형으로 간주되므로 성능 조정에만 사용해야 합니다.
리스트 이해는 아주 간단한 해결책일 것 같습니다.
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]]
numpy 사용
우아함의 정의는 꽤 의심스러울 수 있지만, 만약 당신이 함께 일하고 있다면.numpy
어레이를 생성하고 목록으로 변환(필요한 경우...)하는 것은 사용하는 것에 비해 효율적이지는 않지만 매우 실용적일 수 있습니다.map
함수 또는 목록 이해.
import numpy as np
a = b = range(10)
zipped = zip(a,b)
# result = np.array(zipped).tolist() Python 2.7
result = np.array(list(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((a,b))[0].tolist()
언급URL : https://stackoverflow.com/questions/8372399/zip-with-list-output-instead-of-tuple
'it-source' 카테고리의 다른 글
이클립스에서 AVD 에뮬레이터의 크기를 조정하는 방법은 무엇입니까? (0) | 2023.05.11 |
---|---|
.(C# 또는 VB에서 항상 합법적입니다.그물? (0) | 2023.05.11 |
UTC/GMT 시간을 현지 시간으로 변환 (0) | 2023.05.11 |
Func와 딜러의 차이점은 무엇입니까? (0) | 2023.05.11 |
ASP.NET 2.0 - app_offline.htm 사용방법 (0) | 2023.05.11 |