我刚刚开始使用Scala,因此我可以用更实用的方式来做事.
只是想知道是否有更实用的方法来实现如下所示:
def expand(exp: String): String = {
var result = exp
for ((k,v) <- libMap) {result = result.replace(k, "(%s)".format(v))}
result
}
Run Code Online (Sandbox Code Playgroud)
或者一般而言,给定一个字符串和一些可迭代的集合,遍历集合并为每个元素,逐步修改输入字符串.
干杯
ElementTree for Python(2.6)的标准实现不提供指向父节点的父节点的指针.因此,如果需要父母,建议循环过父母而不是孩子.
考虑我的xml是这样的形式:
<Content>
<Para>first</Para>
<Table><Para>second</Para></Table>
<Para>third</Para>
</Content>
Run Code Online (Sandbox Code Playgroud)
以下查找所有"Para"节点而不考虑父节点:
(1) paras = [p for p in page.getiterator("Para")]
Run Code Online (Sandbox Code Playgroud)
这(改编自effbot)通过循环它们而不是子节点来存储父节点:
(2) paras = [(c,p) for p in page.getiterator() for c in p]
Run Code Online (Sandbox Code Playgroud)
这是完全合理的,并且可以使用条件扩展以实现(假设)与(1)相同的结果,但添加了父信息:
(3) paras = [(c,p) for p in page.getiterator() for c in p if c.tag == "Para"]
Run Code Online (Sandbox Code Playgroud)
的ElementTree的文档表明getIterator()方法的方法做了深度优先搜索.在不查找父级(1)的情况下运行它会产生:
first
second
third
Run Code Online (Sandbox Code Playgroud)
但是,从(3)中的段落中提取文本,得出:
first, Content>Para
third, Content>Para
second, Table>Para
Run Code Online (Sandbox Code Playgroud)
这似乎是广度优先的.
因此,这提出了两个问题.
我希望有人可以在Scala中为我提供一些基本的代码帮助.我用Python编写了一些演示代码.
考虑元素列表,其中元素可以包含整数或其他元素的列表.我想递归检查这个结构并修改它,同时保持整体结构.
为了在python中表示这一点,我使每个'element'成为一个带有一个键的字典('i'表示项目).与该键对应的值是int或类似dicts的列表.从而,
lst = [{'i': 1}, {'i': 2}, {'i': [{'i': 5}, {'i': 6}]}, {'i': 3}]
def recurse(x):
if isinstance(x, list):
return [recurse(a) for a in x]
else:
if isinstance(x['i'], list):
return dict(i=[recurse(a) for a in x['i']])
else:
return dict(i=(x['i'] + 1))
print "Input:"
for i in lst:
print i
print "\nResult:\n%s" % recurse(lst)
>>>
Input:
{'i': 1}
{'i': 2}
{'i': [{'i': 5}, {'i': 6}]}
{'i': 3}
Result:
[{'i': 2}, {'i': 3}, {'i': [{'i': 6}, {'i': 7}]}, {'i': 4}]
Run Code Online (Sandbox Code Playgroud)
我理解这是一种奇怪的做法,但我提供的数据就是这样的结构.我认为我的问题是python允许你从同一个函数返回不同的类型,而我不相信Scala. …
这是关于pythonic编码的一个非常简单的问题.
给定一个列表,如果你想计算满足(A和B)的项目的比例,那些满足(A)的项目,一个自然的解决方案是:
想象一下,列表是整数,条件A是(> 3),条件B是(> 5)
count = 0
correct = 0
for item in items:
if item > 3:
count += 1
if item > 5:
correct += 1
score = float(correct) / count
print '%.2f' % score
Run Code Online (Sandbox Code Playgroud)
替代解决方案:
count = len([1 for i in items if i > 3])
correct = len([1 for i in items if i > 5])
score = float(correct) / count
print '%.2f' % score
Run Code Online (Sandbox Code Playgroud)
替代方案对我来说看起来更性感,虽然它循环通过项目两次并且效率不高.对于这种常见情况是否有可接受的pythonic解决方案,或者第一种解决方案是否足够好?
谢谢.