[英]MULTI level dict: Return reference instead of the content
我有一棵樹。 我必須計算每片葉子的累計總和。 最后按總和只保留前 N 個葉子。
到目前為止,我得到了總和,我得到了葉子的內容。問題是我想要回到葉子的參考文獻,這樣我就刪除了那些 cumsum 低的
有辦法嗎?
import numpy as np
class BeamTree(dict):
def __init__(self, *args, **kwargs):
super(BeamTree, self).__init__(*args, **kwargs)
self.__dict__ = self
self.nodes = []
def add(self, a, aa, q):
self.nodes.append( BeamTree({ 'a': a, 'aa': aa, 'qq': q, 'qs':0 }) )
return self.nodes[-1]
def qsum(self, q=0):
if len(self.nodes) == 0 : return []
leafs = []
for node in self.nodes:
node['qs'] = q + node['qq']
leafs.extend( node.qsum(node['qs']) )
if len(node.nodes) == 0 : leafs.append(node)
if len(leafs) > 0 : return leafs
return []
def generate(self, branch=3, depth=3):
if depth < 1 : return
for b in range(branch) :
sym = 's' + str(np.random.randint(100))
aix = np.random.randint(100)
q = np.random.rand()
node = self.add(sym, aix, q)
node.generate(branch, depth-1)
這是一個測試:
In [212]: b=BeamTree(); b.generate(2,2)
In [213]: l=b.qsum(0)
In [214]: b
Out[214]:
{'nodes': [{'a': 's80',
'aa': 56,
'qq': 0.673,
'qs': 0.673,
'nodes': [{'a': 's8', 'aa': 16, 'qq': 0.115, 'qs': 0.788, 'nodes': []}, {'a': 's64', 'aa': 10, 'qq': 0.599, 'qs': 1.272, 'nodes': []}]},
{'a': 's67',
'aa': 0,
'qq': 0.900,
'qs': 0.900,
'nodes': [{'a': 's69', 'aa': 23, 'qq': 0.801, 'qs': 1.700, 'nodes': []}, {'a': 's8', 'aa': 41, 'qq': 0.826, 'qs': 1.726, 'nodes': []}]}]}
In [215]: l
Out[215]:
[{'a': 's8', 'aa': 16, 'qq': 0.115, 'qs': 0.788, 'nodes': []},
{'a': 's64', 'aa': 10, 'qq': 0.599, 'qs': 1.272, 'nodes': []},
{'a': 's69', 'aa': 23, 'qq': 0.801, 'qs': 1.700, 'nodes': []},
{'a': 's8', 'aa': 41, 'qq': 0.826, 'qs': 1.726, 'nodes': []}]
In [216]: del l[0]
In [217]: l
Out[217]:
[{'a': 's64', 'aa': 10, 'qq': 0.599, 'qs': 1.272, 'nodes': []},
{'a': 's69', 'aa': 23, 'qq': 0.801, 'qs': 1.700, 'nodes': []},
{'a': 's8', 'aa': 41, 'qq': 0.826, 'qs': 1.726, 'nodes': []}]
In [218]: b
Out[218]:
{'nodes': [{'a': 's80',
'aa': 56,
'qq': 0.673,
'qs': 0.673,
'nodes': [{'a': 's8', 'aa': 16, 'qq': 0.115, 'qs': 0.788, 'nodes': []}, {'a': 's64', 'aa': 10, 'qq': 0.599, 'qs': 1.272, 'nodes': []}]},
{'a': 's67',
'aa': 0,
'qq': 0.900,
'qs': 0.900,
'nodes': [{'a': 's69', 'aa': 23, 'qq': 0.801, 'qs': 1.700, 'nodes': []}, {'a': 's8', 'aa': 41, 'qq': 0.826, 'qs': 1.726, 'nodes': []}]}]}
In [219]:
我想將 REFERENCES 返回到葉子,以便我刪除那些 cumsum 低的
實際上,您得到了對葉子的引用,如 Python 中的“一切”都是一個引用,但您真正需要的是對父nodes
列表的引用,以便您可以從該列表中刪除葉子引用。
所以像這樣:
if len(node.nodes) == 0: leafs.append((self.nodes, node))
現在你有了 (list, node) 元組,要刪除這樣的葉子,你會做這樣的事情:
for nodes, leaf in leafs:
if <your condition for removal>:
nodes.remove(leaf)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.