我有一个名为“ wordAndPronounciation.txt”的文本文件,其中包含以下内容。预期的输出是单词作为关键字,单词之后的任何字符串都作为值串联在一起。
DEFINE D IH0 F AY1 N
PHOTOGRAPH F OW1 T AH0 G R AE2 F
输入:"wordAndPronounciation.txt"
输出:{"DEFINE": "DIH0FAY1N", "PHOTOGRAPH": "FOW1TAH0GRAE2F"}
在Python中,我可以做到
def wordAndPronounciation(filename):
table = {}
with open(filename,'r') as x:
for i in x:
table[i.split(' ', 1)[0]] = ''.join(i.split()[1:])
return table
现在我该如何在Scala中做到这一点?
我尝试过,但是我认为这是不正确的。
for (line <- Source.fromFile(filename).getLines) {
first, *middle, last = text.split()
*middle = *middle.concat(last)
table=Map(first -> *middle) }
还有一件事,是否有一种简单的方法可以在Scala中反转字符串?
在python中,我可以执行此操作,其中string = "CAT"
和您
print(string[::-1])
我试图这样做以反转Scala中的字符串,
var reversedC = ("" /: string)((a, x) => x + a)
,但它给出了参数错误。
答案 0 :(得分:2)
这与您的Python代码大致相当。
def wordAndPronounciation(fileName: String): Map[String,String] =
io.Source.fromFile(fileName) //open file
.getLines() //read file line-by-line
.map(_.split("\\s+")) //spit on spaces
.map(a => (a.head, a.tail.reduce(_+_))) //create tuple
.toMap //as dictionary
P.S。 "reverse".reverse //res0: String = esrever
答案 1 :(得分:1)
我不知道*middle
是 Python 中用于存储事物列表的有效语法。但我确定它在 Scala 中无效。
其次,您的无所作为。除了table
是可变的 var 之外,但在这种情况下,您不是在更新其内容,而是覆盖它。
您的问题可以通过这种方式解决。
val map = (for {
line <- Source.fromFile(filename).getLines
words = line.split(" ")
} yield words.head -> words.tail.mkString).toMap
// map: Map[String, String] = ...
与以下相同:
val map =
Source
.fromFile(filename)
.getLines
.map(line => line.split(" "))
.map { case Array(head, tail @ _*) => head -> tail.mkString }
.toMap
由于for / yield
语句只是map
,flatMap
和filter
调用的糖语法。
最后,要反转字符串,只需调用reverse
方法
"Hello, world!".reverse
// res0: String = "!dlrow ,olleH"