Python 合适的数据结构
我需要创建一个数据结构来保存不同公司的信息,并遵循以下规则 如果A公司拥有B公司50%以上的股份,A公司“控制”B公司。 如果B公司拥有C公司50%以上的股份,那么B控制C公司,A控制B和C公司。 如果A公司控制B、C和D公司,并且B、C和D公司在E公司的股份加起来超过50%,则A公司拥有E公司 我做得很好,但最后一部分把我搞砸了。到目前为止,我的程序以无休止的循环结束,或者最后一部分不起作用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公司 我做得很好,但最后一部分把我搞砸了。到目前为止,我的程序以无休止的循环结束,或者最后一部分不起作用 我意识到这个问题可能有点拙劣,但我欣赏哪怕是正确方向上的一点 让我们看看你到目前为止有什么。如果我们不
我意识到这个问题可能有点拙劣,但我欣赏哪怕是正确方向上的一点 让我们看看你到目前为止有什么。如果我们不知道你做了什么,我们就帮不了你。听起来像棵树。在每个父节点中,存储%所有权和指向子节点的指针。将所有所有权>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()