튜플 목록을 여러 목록으로 변환하는 방법은 무엇입니까?
튜플 목록이 있는데 여러 목록으로 변환하려고 합니다.
예를 들어 튜플의 목록은 다음과 같습니다.
[(1,2),(3,4),(5,6),]
Python에 다음으로 변환하는 내장 함수가 있습니까?
[1,3,5],[2,4,6]
이것은 간단한 프로그램일 수 있습니다.하지만 저는 파이썬에 그런 내장 기능이 있는지 궁금할 뿐입니다.
내장 기능zip()
거의 원하는 대로 할 수 있습니다.
>>> list(zip(*[(1, 2), (3, 4), (5, 6)]))
[(1, 3, 5), (2, 4, 6)]
유일한 차이점은 목록 대신 튜플을 얻는다는 것입니다.다음을 사용하여 목록으로 변환할 수 있습니다.
list(map(list, zip(*[(1, 2), (3, 4), (5, 6)])))
python 문서에서:
zip()는 * 연산자와 함께 사용하여 목록의 압축을 풀 수 있습니다.
구체적인 예:
>>> zip((1,3,5),(2,4,6))
[(1, 2), (3, 4), (5, 6)]
>>> zip(*[(1, 2), (3, 4), (5, 6)])
[(1, 3, 5), (2, 4, 6)]
또는 목록을 원하는 경우:
>>> map(list, zip(*[(1, 2), (3, 4), (5, 6)]))
[[1, 3, 5], [2, 4, 6]]
>>> a = [(1,2),(3,4),(5,6),]
>>> zip(*a)
[(1, 3, 5), (2, 4, 6)]
franklsf95는 그의 대답에서 성과를 위해 가고 선택합니다.list.append()
하지만 그들은 최적이 아닙니다.
목록 이해도를 추가하여 다음과 같은 결과를 얻었습니다.
def t1(zs):
xs, ys = zip(*zs)
return xs, ys
def t2(zs):
xs, ys = [], []
for x, y in zs:
xs.append(x)
ys.append(y)
return xs, ys
def t3(zs):
xs, ys = [x for x, y in zs], [y for x, y in zs]
return xs, ys
if __name__ == '__main__':
from timeit import timeit
setup_string='''\
N = 2000000
xs = list(range(1, N))
ys = list(range(N+1, N*2))
zs = list(zip(xs, ys))
from __main__ import t1, t2, t3
'''
print(f'zip:\t\t{timeit('t1(zs)', setup=setup_string, number=1000)}')
print(f'append:\t\t{timeit('t2(zs)', setup=setup_string, number=1000)}')
print(f'list comp:\t{timeit('t3(zs)', setup=setup_string, number=1000)}')
결과는 다음과 같습니다.
zip: 122.11585397789766
append: 356.44876132614047
list comp: 144.637765085659
그래서 만약 당신이 공연을 하고 있다면, 당신은 아마도zip()
비록 목록 이해가 그리 멀지는 않지만요.의 성능append
사실 비교해보면 꽤 부족합니다.
불구하고*zip
더 파이썬적인 다음 코드는 훨씬 더 나은 성능을 가집니다.
xs, ys = [], []
for x, y in zs:
xs.append(x)
ys.append(y)
또한, 원래 목록이 있을 때zs
비어 있습니다.*zip
상승하지만 이 코드는 제대로 처리할 수 있습니다.
방금 간단한 실험을 했는데, 다음과 같은 결과가 나왔습니다.
Using *zip: 1.54701614s
Using append: 0.52687597s
여러 번 실행하면,append
보다 3배~4배 빠름zip
테스트 스크립트는 다음과 같습니다.
#!/usr/bin/env python3
import time
N = 2000000
xs = list(range(1, N))
ys = list(range(N+1, N*2))
zs = list(zip(xs, ys))
t1 = time.time()
xs_, ys_ = zip(*zs)
print(len(xs_), len(ys_))
t2 = time.time()
xs_, ys_ = [], []
for x, y in zs:
xs_.append(x)
ys_.append(y)
print(len(xs_), len(ys_))
t3 = time.time()
print('Using *zip:\t{:.8f}s'.format(t2 - t1))
print('Using append:\t{:.8f}s'.format(t3 - t2))
내 파이썬 버전:
Python 3.6.3 (default, Oct 24 2017, 12:18:40)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Claudiu의 답변 외에도 다음을 사용할 수 있습니다.
>>>a, b = map(list, zip(*[(1, 2), (3, 4), (5, 6)]))
>>>a
[1,3,5]
>>>b
[2,4,6]
@Peyman mohseni kiasari에 따라 편집됨
Claudiu와 Claudiu의 답변에 추가하고 python 3의 iter 도구에서 맵을 가져와야 하므로 다음과 같은 목록 이해도 사용합니다.
[[*x] for x in zip(*[(1,2),(3,4),(5,6)])]
>>> [[1, 3, 5], [2, 4, 6]]
언급URL : https://stackoverflow.com/questions/8081545/how-to-convert-list-of-tuples-to-multiple-lists
'programing' 카테고리의 다른 글
iPhone이 개인 라이브러리 없이 SSID를 얻습니다. (0) | 2023.05.02 |
---|---|
현재 Git 브랜치를 삭제하려면 어떻게 해야 합니까? (0) | 2023.05.02 |
IEnumberable에서 목록으로 변환 (0) | 2023.05.02 |
Bash에서 문자열에서 새 줄을 제거하는 방법 (0) | 2023.04.27 |
메이븐 관리 종속성에 대한 Eclipse에 연결된 소스 jar 파일 가져오기 (0) | 2023.04.27 |