我有一个下面的字典来显示集团公司层次结构的关系。
dict = {}
dict["A"] = ['Company A']
dict["B"] = ['Company B']
dict["C"] = ['Company C'] # This can be removed if necessary
dict["D"] = ['Company D']
dict["E"] = ['Company E']
dict["F"] = ['Company F'] # This can be removed if necessary
dict["G"] = ['Company G'] # This can be removed if necessary
现在,我有了这些根级别元素( company )之间的父子关系,例如,一个公司可能控制多个公司。密钥C是密钥A&B的父密钥。(公司C拥有公司A和B)密钥F是密钥D& E的父密钥。最后,密钥G是C&F的父密钥。
我需要创建一个新的dict,如下所示,或者创建一个新的dict,它显示below.Can这个父子关系可以被动态处理,并在output.How下面获得父子关系,这样就可以更新关系和更新输出。
{'A': ['Company A'],
'B': ['Company B'],
'C': ['Company A', 'Company B'],
'D': ['Company D'],
'E': ['Company E'],
'F': ['Company D', 'Company E'],
'G': ['Company A', 'Company B','Company D', 'Company E'],
}
有没有人可以分享我可以创建这个的代码。
发布于 2020-08-26 10:06:42
假设您有另一个字典或其他结构将父项映射到它们的子项,您可以定义一个递归函数来获取不同键的所有“叶子”。如果树更大,您可能希望使用functools.lru_cache
来记忆和重用过去的部分结果。
from functools import lru_cache
d = {'A': ['Number A'], 'B': ['Number B'],
'C': ['Number C'], 'D': ['Number D'],
'E': ['Number E'], 'F': ['Number F'],
'G': ['Number G']}
is_parent_of = {'C': ['A', 'B'], 'F': ['D', 'E'], 'G': ['C', 'F']}
@lru_cache(None) # optional, for caching
def get_leafs(x):
if x in is_parent_of:
return [z for y in is_parent_of[x] for z in get_leafs(y)]
else:
return d[x]
print({x: get_leafs(x) for x in d})
发布于 2020-08-26 10:07:58
您可以简单地创建另一个字典,在其中定义所有父级及其子级,并简单地循环当前字典,如果您发现有任何键与父级字典中的任何键匹配,则结果字典应该继承其值。
空谈很便宜,让我给你看一些代码
示例
dictionary = {}
dictionary["A"] = ['Number A']
dictionary["B"] = ['Number B']
dictionary["C"] = ['Number C']
dictionary["D"] = ['Number D']
dictionary["E"] = ['Number E']
dictionary["F"] = ['Number F']
dictionary["G"] = ['Number G']
parents = {
'C': ['Number A', 'Number B'],
'F': ['Number D', 'Number E'],
'G': ['Number A', 'Number B','Number D', 'Number E'],
}
res = {}
for x, y in dictionary.items():
if x in parents.keys():
res[x] = parents[x]
else:
res[x] = y
print(res)
https://stackoverflow.com/questions/63594847
复制