2012-09-12 10 views
12

私はタプルの次のリストがあるとします。スカラ:どのようにリストにタプルの要素を変換する

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つの別々のステートメントを記述することなく、上記を達成するためのよりエレガントな(機能的な)方法はありますか?

答えて

11

同様

これはリストのリストとしてあなたの結果が得られます:

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 

更新:Blaisorbladeが指摘しているように、標準ライブラリunzip3、ちょうどunzipようですが、トリプルの代わりに、ペアのためである:

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

言うまでもなくあなたは上記の(しかし、タプルのために私の手巻きのソリューションに対するこの方法を支持すべきである、と言うには、このための組み込みメソッドを持っています> 3の場合、これはまだ適用されます)。

+0

遅すぎる:) が投稿しようとした可能読者のために、非常に不可解です: 'tuples.map {T => t._1 :: t._2 :: t._3 :: Nil} .transpose'いいね。 +1 –

+0

悪い考え方、あなたは他の答えから解凍を使用する必要があります:http://stackoverflow.com/a/17281359/53974 – Blaisorblade

+0

@Balisorblade:私は反対する必要があります。これは 'Tuple2'だったのですが、' Tuple3'です。 'unzip'はペアの解凍のみを処理し、jeshan自身の例は' Tuple2'ではなく 'Tuple3'のリストを表示します。 –

1

単一行で文を書くことができます。

(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)) 
+1

が、それは –

0

私はエレガントなことは分かりませんが、となります。タプルを保存する中間ステップを1行で行うことはできません。おそらくそれは...

(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)) 
3

あなたは、任意のタプルサイズのために使用することができる何かをしたい場合:

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

明らかにし、これを代わりにList of Arraysがあれば、よりエレガントに表現できます。

+3

+1は_1、_2、_3のないソリューションです! –

+1

または単に: 'tuples.map(_。productIterator.toList).transpose.asInstanceOf [List [List [String]]'。私はこの解決策を投稿しようとしていましたが、キャストは残念です。 –

+0

私はその解決策についても考えましたが、このバージョンはおそらく転置よりも効率的です。入力として 'Array'sの' List'を取ると、キャストを避けることができます。 –

10

あなたが解凍したい:

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) 
+2

これは他の種類のタプルではなくペアでのみ機能します –

+1

トリプルに対してunzip3があります。 – Blaisorblade

関連する問題