【问题标题】:How to propagate tree nodes in Python如何在 Python 中传播树节点
【发布时间】:2011-11-05 08:05:34
【问题描述】:

我正在处理 Python 程序中的树结构。 树中的每个节点都有一个字典“儿子”,其键保存弧信息,值 是子节点。问题是将节点列表传播给他们所有的儿子。 我用:

current_nodes = reduce(lambda s,x:s+x, map(lambda node:node.sons.values(),current_nodes),[])

其中current_nodes 是初始(和更新的)节点列表。

我的程序大部分时间都在执行这个 reduce 操作。有没有更快的方法来实现它?

谢谢!

编辑: 嗨,请让您知道代码: sum((node.sons.values() for node in current_nodes), []) 尽管 pythonic,并没有真正明显更快——如果节点列表 很长(> 20000),传播速度不成比例地减慢,实际上非常慢。我不知道为什么。

然后我定义:

def Ext(nodes)
    l=[]
    for node in nodes:
        l.extend(node.sons.values())
    return l

然后我使用:current_node = Ext(current_node)。 这种方法实际上要快得多。我猜 sum() 函数在处理列表连接时不如列表的 extend 方法高效。

【问题讨论】:

  • sum 完成这项工作时,为什么你使用那个丑陋的reduce?和那个丑陋的map一样的东西:List comprehensions FTW
  • 可以 sum 连接一个列表吗?
  • 我明白了。 sum([node.sons.values() for node in current_nodes],[])
  • 是的,sum 需要一个基本元素作为“累加器”(如果序列为空,那么非空序列的第一个元素不需要特殊处理),默认为0,但可以替换。要汇总列表,您只需从一个空列表开始。但是,sum 会任意拒绝sum(['foo', 'bar', 'baz'], ''),并告诉你改用''.join 成语。我个人认为这是 TSBOWTDI 的一个过分热心的应用 :(
  • 顺便说一句,“children”是此类数据成员的规范名称...

标签: python tree reduce


【解决方案1】:
from itertools import chain
list(chain.from_iterable(node.sons.values() for node in current_nodes))

应该更快。 maps 上的 mapreduce 很慢。不知道chain有多快;你可以试试

sum((node.sons.values() for node in current_nodes), [])

也是。

【讨论】:

  • 我以为你在休息;)
  • 我每天登录一次以计算我的旗帜重量,我碰巧看到了这个:)
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2021-02-20
  • 2014-06-07
相关资源
最近更新 更多