복붙노트

[SCALA] 스칼라 : 목록에 튜플 요소를 변환하는 방법

SCALA

스칼라 : 목록에 튜플 요소를 변환하는 방법

내가 튜플의 다음과 같은 목록이 있다고 가정 해 봅시다 :

val tuples = listOfStrings.map(string => {
            val split = string.split(":")
            (split(0), split(1), split(2))
        })

나는 다른 목록 등의 목록에서 분할 (0), 분할 (1)을 좀하고 싶습니다. 이 얻을 수있는 간단한 방법은 서면입니다 :

list1 = tuples.map(x => x._1).toList
list2 = tuples.map(x => x._2).toList
list3 = tuples.map(x => x._3).toList

3 개 계산서를 작성하지 않고도 위를 달성하는 더 우아한 (기능) 방법이 있습니까?

해결법

  1. ==============================

    1.이 목록의 목록으로 당신에게 결과를 줄 것이다 :

    이 목록의 목록으로 당신에게 결과를 줄 것이다 :

    tuples.map{t => List(t._1, t._2, t._3)}.transpose
    

    로컬 변수에 저장하고 싶다면, 바로 수행

    val List(l1,l2,l3) = tuples.map{t => List(t._1, t._2, t._3)}.transpose
    

    UPDATE : 바와 같이 Blaisorblade에 의해 지적, 표준 라이브러리는 실제로가 내장되어 이에 대한 방법 : 그냥 압축 해제처럼 대신 쌍 트리플위한 unzip3 :

    val (l1, l2, l3) = tuples.unzip3
    

    말할 필요도없이, 위 내 손으로 압연 솔루션을 통해이 방법을 선호한다 (그러나 인수에 대응> 3의 튜플을이 아직도 여전히 적용됩니다).

  2. ==============================

    2.당신은 압축 해제합니다 :

    당신은 압축 해제합니다 :

    scala> val (numbers, homonyms) = List(("one", "won"), ("two", "too")).unzip
    numbers: List[java.lang.String] = List(one, two)
    homonyms: List[java.lang.String] = List(won, too)
    
  3. ==============================

    3.당신이 뭔가를 원한다면 임의의 튜플 크기에 사용할 수 :

    당신이 뭔가를 원한다면 임의의 튜플 크기에 사용할 수 :

    val tupleSize = 3
    0.until(tupleSize).toList
        .map(x => (_:Product).productElement(x).asInstanceOf[String])
        .map(tuples.map(_))
    

    대신 배열의 목록이 있다면 분명히, 이것은 더 우아하게 표현 될 수있다.

  4. ==============================

    4.당신은 한 줄의 문장을 작성할 수 있습니다.

    당신은 한 줄의 문장을 작성할 수 있습니다.

    처럼

     (list1, list2, list3) = tuples.foldRight((List[String](), List[String](), List[String]()))( (a,b) => (a._1 :: b._1, a._2 :: b._2, a._3 :: b._3 ) )
    
  5. ==============================

    5.나는 우아한 모르는 그러나 당신은 튜플을 저장하는 중간 단계없이 한 줄에 그것을 할 수 있습니다. 아마도 그것은 읽기 조금 어렵다 ...

    나는 우아한 모르는 그러나 당신은 튜플을 저장하는 중간 단계없이 한 줄에 그것을 할 수 있습니다. 아마도 그것은 읽기 조금 어렵다 ...

    (for(split <- listOfStrings.map(_.split(":")))
      yield List(split(0), split(1), split(2))).transpose
    

    REPL 예 :

    scala> listOfStrings
    res1: List[java.lang.String] = List(a:b:c, d:e:f, g:h:i)
    
    scala> (for(split <- listOfStrings.map(_.split(":")))
         |   yield List(split(0), split(1), split(2))).transpose
    res2: List[List[java.lang.String]] = List(List(a, d, g), List(b, e, h), List(c, f, i))
    
  6. from https://stackoverflow.com/questions/12392409/scala-how-to-convert-tuple-elements-to-lists by cc-by-sa and MIT license