[scala] zip, unzip 예시

scala 2016. 9. 12. 11:57


zip 메소드는 리스트를 순환하면서 리스트 튜플을 만든다. (내부적으로 iterator 객체를 포함할 때만 동작한다)


zipWithIndex는 따로 List를 주지 않아도 자동으로 0부터 시작하는 list와 합치도록 해준다. 


Stream from 0 은 0부터 시작하는 리스트를 리턴한다. 


unzip은 만어진 리스트 튜플을 다시 리스트 객체로 쪼개주는 역할을 한다. unzip._1은 다시 원래의 list로 리턴하는 메소드이다. 



val list = List(1,2,3,4,5)
println(list.zipWithIndex)
println(list.zip(Stream from 0))
println(list.zip(Stream from 0).unzip._1)


결과는 다음과 같다.


List((1,0), (2,1), (3,2), (4,3), (5,4))

List((1,0), (2,1), (3,2), (4,3), (5,4))

List(1, 2, 3, 4, 5)



문자열도 동일하게 동작한다. 

scala에서는 메소드르 사용할 때 꼭 내부 함수를 의미하는 .나 괄호를 쓰지 않아도 되는 경우가 있다. 마치 수학 연산 같은 느낌을 주기 위해 다음과 같이 List zip List 형태로 쓸 수 있다.


zip, unzip, toMap 메소드 예시를 실행해 본다.

val zipped = List("A", "B") zip List("C", "D")
println(zipped)
println(zipped.unzip)
println(zipped.toMap)


결과는 다음과 같다.


List((A,C), (B,D))

(List(A, B),List(C, D))

Map(A -> C, B -> D)




만약 엘리먼트가 하나가 더 큰 상황에서 zip메소드를 호출하면 긴 엘리먼트 쪽 데이터는 zip 메소드에서 사용하지 않는다.


val zips = List("A", "B") zip List("C")
println(zips)


결과는 다음과 같다.


List((A,C))




두 개 뿐 아니라 세 개의 튜플을 가지는 리스트 객체를 생성할 수도 있다. 


println((List(1,2,3,4,5), List(0,1,2,3,4)).zipped.toList)
println((List(1,2,3,4,5), List(0,1,2,3,4), List(10,11,12,13,14)).zipped.toList)


결과는 다음과 같다. 

List((1,0), (2,1), (3,2), (4,3), (5,4))

List((1,0,10), (2,1,11), (3,2,12), (4,3,13), (5,4,14))


Posted by 김용환 '김용환'

댓글을 달아 주세요