Python 合适的数据结构

Python 合适的数据结构,python,data-structures,python-3.x,Python,Data Structures,Python 3.x,我需要创建一个数据结构来保存不同公司的信息,并遵循以下规则 如果A公司拥有B公司50%以上的股份,A公司“控制”B公司。 如果B公司拥有C公司50%以上的股份,那么B控制C公司,A控制B和C公司。 如果A公司控制B、C和D公司,并且B、C和D公司在E公司的股份加起来超过50%,则A公司拥有E公司 我做得很好,但最后一部分把我搞砸了。到目前为止,我的程序以无休止的循环结束,或者最后一部分不起作用 我意识到这个问题可能有点拙劣,但我欣赏哪怕是正确方向上的一点 让我们看看你到目前为止有什么。如果我们不

我需要创建一个数据结构来保存不同公司的信息,并遵循以下规则

如果A公司拥有B公司50%以上的股份,A公司“控制”B公司。 如果B公司拥有C公司50%以上的股份,那么B控制C公司,A控制B和C公司。 如果A公司控制B、C和D公司,并且B、C和D公司在E公司的股份加起来超过50%,则A公司拥有E公司

我做得很好,但最后一部分把我搞砸了。到目前为止,我的程序以无休止的循环结束,或者最后一部分不起作用


我意识到这个问题可能有点拙劣,但我欣赏哪怕是正确方向上的一点

让我们看看你到目前为止有什么。如果我们不知道你做了什么,我们就帮不了你。听起来像棵树。在每个父节点中,存储%所有权和指向子节点的指针。将所有所有权>50%的节点保留在一个列表中,其他节点保留在另一个列表中。在向下搜索>50%的列表时进行深度优先搜索应该会显示所有可传递的所有权。这里有一个真正的机会进行无休止的循环。如果A公司拥有B公司51%的股份,B公司拥有A公司51%的股份,那么确定所有权可能会变得混乱。
from collections import defaultdict

def find_controlled(company, shares):
    # shares the company owns directly
    controls = set([company])       # avoid the recursion problem pointed out by @Justin
    owns     = defaultdict(float)
    owns.update(shares[company])

    # first level of controlled companies to look at
    add_control = set(k for k,v in owns.items() if v > 0.50)

    while add_control:
        # new level of controlled companies to look at next
        _add_control = set()

        for cpy in add_control:
            controls.add(cpy)
            for k,v in shares[cpy].items():
                owns[k] += v
                if owns[k] > 0.5 and k not in controls:
                    _add_control.add(k)
        add_control = _add_control

    return sorted(controls - set([company]))

def main():
    # Data structure: dict of dict of float
    #   shares['A']['B'] = 0.51     means    A owns 51% of B's shares
    shares = defaultdict(lambda: defaultdict(float))

    # Who owns what
    shares['A']['B'] = 0.60
    shares['A']['C'] = 0.55
    shares['A']['D'] = 0.41
    shares['C']['D'] = 0.10
    shares['B']['E'] = 0.20
    shares['C']['E'] = 0.20
    shares['D']['E'] = 0.20

    # See who A controls:
    controlled = find_controlled('A', shares)
    print('A controls {}'.format(','.join(controlled)))

if __name__=="__main__":
    main()