小编mmm*_*reg的帖子

Scala - 以功能方式修改字符串

我刚刚开始使用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)

或者一般而言,给定一个字符串和一些可迭代的集合,遍历集合并为每个元素,逐步修改输入字符串.

干杯

functional-programming scala

5
推荐指数
1
解决办法
263
查看次数

使用Python ElementTree迭代多个(父,子)节点

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)

这似乎是广度优先的.

因此,这提出了两个问题.

  1. 这是正确和预期的行为吗?
  2. 如果必须保留文档顺序,当子项必须是某种类型但父项可以是任何项时,如何提取(父项,子项)元组.我不认为运行两个循环并将(3)生成的(父,子)映射到(1)生成的顺序是理想的.

python xml elementtree

4
推荐指数
1
解决办法
5828
查看次数

Scala:递归地修改元素/列表的列表

我希望有人可以在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. …

python recursion scala

2
推荐指数
1
解决办法
867
查看次数

Pythonic比例计算两个条件

这是关于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解决方案,或者第一种解决方案是否足够好?

谢谢.

python

1
推荐指数
1
解决办法
2153
查看次数