首页 文章

脚本获取长数据列表并将其转换为Scala列表?

提问于
浏览
-1

我有一个弧形列表(最多200行),如下图所示 . 三元组是(x,y,z),这意味着在重量z处从x到y的边缘 . 我确切地知道文件中有多少行(边数),节点数也是如此 . 我想使用Scala中的List在Scala中创建一个带有这些边的邻接矩阵输入 . 语法就像是例如 List(List(0,0,0,0), List(0,0,0,0))) 我希望有一个脚本可以接受下面显示的窗体的.txt文件并输出adj的Scala语法 . 从这些边缘列出 .

LIST OF ARCS 0 1 0.440004 0 2 0.244452 0 3 0.433273

对于上面的输入,输出应该是

ListBuffer( ListBuffer(0, 0.440004, 0.244452, 0.433273), ListBuffer(0.440004, 0, 0, 0), ListBuffer(0.244452, 0, 0, 0), ListBuffer(0.433273, 0, 0, 0)) 这就是我的想法和想法 . val lines = Source.fromFile("f1.txt") . getLines.toList.map(i => println(i))我可以预填充ListBuffer.fill(10)(10)然后如果我可以弄清楚如何使每一行成为一个类型Ints的三倍,然后我可以更新我预先填充的ListBuffer结构 .

3 回答

  • 2
    with open('input.txt') as infile:
        lines = infile.readlines()[1:]  # skip header
    edges = [line.split() for line in lines]
    edges = [(int(t[0]), int(t[1]), float(t[2])) for t in edges]
    n = max(max(edge[:2]) for edge in edges) + 1
    matrix = [[0] * n for _ in range(n)]
    for edge in edges:
        for x, y in [edge[:2], reversed(edge[:2])]:
            matrix[x][y] = edge[2]
    
    print(str(matrix).replace('[', 'ListBuffer(').replace(']', ')'))
    
  • 2

    在awk中:

    $ cat program.awk
    NR>1 {
        a[NR]=$3
        nr=NR
    }
    END {
        lb="ListBuffer("
        a[1]=0
        for(i=0;i<=nr;i++) {
            b[i]=(i>0?"\t":"") lb (i>1?a[i]:"")
            b[1]=b[1] a[i] (i<nr?",":"")
        }
        for(i=0;i<=nr;i++)
            printf "%s%s%s\n", b[i], (i>1?",0,0,0":""), (i>0?")"(i<nr?",":")"):"")
    }
    

    运行:

    $ awk -f program.awk f1.txt
    ListBuffer(
            ListBuffer(0,0.440004,0.244452,0.433273),
            ListBuffer(0.440004,0,0,0),
            ListBuffer(0.244452,0,0,0),
            ListBuffer(0.433273,0,0,0))
    
  • 1

    当我们可以通过读取文件并在Scala中处理其输入来直接创建所需的结构时,无需尝试使用脚本生成Scala源代码 .

    给出以下“arcs.txt”文件:

    LIST OF ARCS
    0   1   0.440004
    0   2   0.244452
    0   3   0.433273
    1   3   0.161616
    

    我们读取数据并将其放入列表中

    import scala.io.Source
    val arcData = Source.fromFile("/home/maasg/playground/data/arcs.txt").getLines.toList
    

    删除 Headers ,解析文本并保留格式良好的数据点作为 MapMap . 请注意,这已经是一个稀疏矩阵表示,其中缺少的值可以假设为0 .

    val sparse = arcData.drop(1)
                      .flatMap{line =>  line.split("[ ]+") match {
                                            case Array(from, to, weight.toDouble) => Some(((from, to), weight))
                                            case _ => None
                                         }
                               }
                      .toMap
    

    为了获得密集矩阵,我们首先使用稀疏矩阵的键计算顶点:

    val vertices = sparse.keys.flatMap{case (v1, v2) => Seq(v1,v2)}.toList
    

    然后,我们创建一个密集的邻接矩阵表示:

    val matrix = vertices.map(xs => vertices.map(ys => sparse.get((xs,ys)).getOrElse(0.0)))
    // matrix: List[List[Double]] = List(List(0.0, 0.0, 0.0, 0.0, 0.0),
    //     List(0.25, 0.0, 0.0, 0.0, 0.161616), 
    //     List(0.0, 0.440004, 0.0, 0.244452, 0.433273), 
    //     List(0.0, 0.0, 0.0, 0.0, 0.0), 
    //     List(0.0, 0.0, 0.0, 0.0, 0.0)
    //)
    

相关问题