簡體   English   中英

多級字典:返回引用而不是內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM