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

2024-09-30 22:19:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个弧列表(最大200行)在一个图表中,如下图所示。三元组是(x,y,z),这意味着从x到y的边的权重为z。我确切地知道文件中有多少行(边的数量),以及节点的数量。我想使用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)) 这是我的想法。 值线=Source.fromFile文件(“f1.txt”)。getLines.toList.map(i=>;打印n(i)) 我可以预先填充ListBuffer.fill文件(10) (10)然后如果我能弄清楚如何使每一行成为int类型的三倍,那么我就可以更新我预先填充的ListBuffer结构。你知道吗


Tags: 文件txt脚本列表数量节点图表语法
3条回答
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(']', ')'))

在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))

当我们可以通过在Scala中读取文件并处理其输入来直接创建所需的结构时,就不需要尝试用脚本生成Scala源代码。你知道吗

考虑到以下情况”弧.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

删除标题,解析文本并将格式良好的数据点保留为Map(x,y)-> weight。请注意,这已经是一种稀疏矩阵表示,其中缺少的值可以假定为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)
//)

相关问题 更多 >