我在图表中有一个弧列表(最多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结构。
答案 0 :(得分: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(']', ')'))
答案 1 :(得分: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))
答案 2 :(得分:1)
当我们可以通过读取文件并在Scala中处理其输入来直接创建所需的结构时,没有必要尝试使用脚本生成Scala源代码。
给出以下&#34; arcs.txt&#34;文件:
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)
//)