Python Scala 中的元组列表

Python List of tuples in Scala

我正在使用 Jython 执行 python 代码部分(一个 python 模块,带有来自现有代码库的实用函数),returns 一个元组列表,但是我在 scala 中得到的是一个简单的扁平列表。关于原因的任何建议都会有所帮助。 由于我是 Scala 和 Jython 的初学者,这可能不是解决问题的最佳方法。我调用 python 函数,如下所示:

val viaJython = true
val interp = new PythonInterpreter()
val pyCode =
  interp.compile(
    """import myModule as df
       | aList = df.find_date(foundVal)"""
  )

interp.set("foundVal", foundVal)
interp.exec(pyCode)
println(interp.get("aList"))

一个简单的解决方案可能是:如果你得到一个展平的列表并且你知道元组大小 n 那么它可以用 List.grouped(n).toList 展平成列表的列表。然后可以使用如下所示的映射或使用 Convert a Scala list to a tuple? and Is there way to create tuple from list(without codegeneration)? 中给出的方法将子列表转换为元组。如果您不知道元组长度,那么您可以通过检查 javap -c 在 class 文件上生成的字节码来找出答案。

另一种方法是使用 Scala 提供的 Java 集合、迭代器、可迭代对象和枚举器的隐式转换。要应用它们,请在执行 Jython 之前添加 "import scala.collection.JavaConversions._",并将生成的 Jython List 设置为具有显式类型声明的 Scala mutable.Buffer。例如,如果 Jython List 元素是 Int 的 3 元组(Scala 中的 Tuple3[Int,Int,Int]),则转换后的 Scala 集合可以定义为:

val pyBuffer: scala.collection.mutable.Buffer[Tuple3[Int,Int,Int]] = ResultingJavaListFromJython

使用 scala.collection.mutable.Buffer 的原因是 scala.collection.JavaConversions 支持的集合用于 Java 列表转换。转换为 mutable.Buffer 完成后,可以使用其 "to" 函数将其转换为许多其他类型的集合中的任何一种,包括 toList 以将其转换为 Scala 列表,例如:

val pyList = pyBuffer.toList

有关参考,请参阅 http://www.scala-lang.org/api/2.11.7/#scala.collection.JavaConversions$ 或您使用的任何版本的 Scala 的等效 API 页面。

另一个问题是 Java 没有元组,因此 Jython 使用 java.util.List 实现 PyTuple,而 Scala 不提供到元组的转换。出于这个原因,假设每个 PyTuple 都有 Int 元素,要尝试的另一件事是:

import scala.collection.mutable.Buffer
val pyBuffer2: Buffer[Buffer[Int]] = ResultingJavaListFromJython

然后pyBuffer2的元素就可以映射成元组了。例如,假设每个 Buffer[Int] 元素有 3 个元素:

import scala.collection.mutable.ArrayBuffer
val pyBuffer3 = pyBuffer2.map{case ArrayBuffer(a,b,c) => (a,b,c)}

现在pyBuffer3可以用toList转换为Scala List,如上所示。

导入 scala.collection.mutable.ArrayBuffer 并对其进行匹配的原因是它是 Scala 对 mutable.ArrayBuffer 的默认实现,这是一个特征。