假设我有一个数组,它表示一个节点网络,其中连接的节点被描述为“from nodes”和“to nodes”:
a = array([(1, 2), (2, 3), (3, 4), (4, 5), (2, 6), (6, 7), (7, 8), (2, 9),
(9, 10), (10, 11), (2, 12), (12, 13), (13, 14), (13, 15), (14, 16)],
dtype=[('fnode', '<i4'), ('tnode', '<i4')])
a['fnode']
array([ 1, 2, 3, 4, 2, 6, 7, 2, 9, 10, 2, 12, 13, 13, 14])
a['tnode']
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
如何将“to nodes”组合到列表中,使它们共享相同的“from node”?在
我想要这种格式:
^{pr2}$编辑
为了清楚起见,我希望没有“To nodes”(例如节点8)的“from nodes”与一个空列表相关联。在
您可以使用
itertools.groupby
。在定义数组:
排序:
^{pr2}$然后将其分组(我在这里将生成器转换为一个列表,以便您可以看到其结果):
^{3}$然后您可以进行任何需要的后处理。在
例如,在本例中,您要的是更像
[(k, map(lambda (a,b): b, v)) for k,v ...
的内容。在(请注意,对数组进行排序非常重要。
groupby
的操作方式与POSIXuniq
相同,因为它只组合相邻的元素。要组合所有元素,请按与分组依据相同的键排序。)如果你的目标还没有达到你的目标,那就用你的速度吧。那样的话,我建议使用熊猫图书馆。在
大型阵列上的定时信息:
^{pr2}$使用
collections.defaultdict
:相关问题 更多 >
编程相关推荐