[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 '김용환'
,