【问题标题】:How can I split a list of tuples scala如何拆分元组scala列表
【发布时间】:2020-04-05 19:06:49
【问题描述】:

我在 Scala 中有这个列表(实际上长度为 500):

List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))

我该怎么做才能创建一个包含以下内容的新列表:

List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))

基本上我想要一个新的元组列表,其中包含旧元组的第一个元素和元组内列表的每个元素。我不确定如何开始实现这一点,这就是为什么我没有发布任何代码来展示我的尝试。我真的很抱歉,但我无法理解这一点。感谢您提供的任何帮助。

【问题讨论】:

    标签: scala dictionary functional-programming tuples higher-order-functions


    【解决方案1】:
    scala> val xs = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
    xs: List[(Int, List[Int])] = List((1,List(1, 2, 3)), (2,List(1, 2, 3)), (3,List(1, 2, 3)))
    
    scala> xs.flatMap { case (x, ys) => ys.map(y => (x, y)) }
    res0: List[(Int, Int)] = List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
    

    【讨论】:

    【解决方案2】:

    与@Andriy 完全相同,但使用for comprehension。 这到底是 same 但更易读恕我直言。

    val result = for {
      (x, ys) <- xs
      y <- ys
    } yield (x, y) // You can also use x -> y
    

    (再次,我建议您遵循任何教程,这是一个基本练习,如果您了解 mapflatMap 的工作原理,您应该不会有任何问题)

    【讨论】:

    • 是的,你是对的!我觉得大多数例子都比这个更容易,这就是为什么我在需要实现更高要求的东西时有点困惑。感谢您的澄清,它真的很有帮助
    【解决方案3】:

    可能值得一提的是,Andriy Plokhotnyuk 的解决方案也可以重写为便于理解:

    val list = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
    
    val pairs = for {
      (n, nestedList) <- list
      m <- nestedList
    } yield (n, m)
    
    assert(pairs == List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)))
    

    编译器将有效地将 for-comprehension 重写为 flatMap/map 链,如另一个答案中所述。

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 1970-01-01
      • 2014-04-27
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多