我在建立父子标记的字典方面遇到了困难。
我有一本这样的字典:
d = {
'A': ['Blue'],
'B': ['A'],
'C': ['A'],
'D': ['C'],
}
这是我的逻辑或思考过程:如果键是'Blue'
,则它是父键,并得到0
的标志。如果value
在d.keys()
中,它将得到一个标志1
。我卡住的地方是孙子孙女。这是我现在拥有的代码,并且是由于我将头撞到比喻墙上好几个小时而导致的。
level = 0
while level < 1000:
for key, value in d.items():
if value[0] == 'Set':
if len(value) == 1:
value.extend([level])
elif len(value) >= 2:
continue
elif value[0] in d.keys():
value.extend([level])
level += 1
结果是:
A: ['Blue', 0]
B: ['A', 1]
C: ['A', 2]
D: ['D', 3]
D
是C
的孙代,应具有2
的标志,而C
是A
的子代,其值应为2
,就像另一个孩子B
一样。
这样做的目的是创建正确的标志,而不管有多少个孙级或曾孙级。
这里更大的图景是使用此数据插入嵌套循环。我有一个奇怪的数据库,必须使用某个专有模块来遍历通过类属性提供给我的查找表。因此,代码将是
while parent:
...block of code for parent...
...insert same structure here if not the parent...
...statement at end of parent block...
因此,子循环可能看起来像这样:
while parent:
...block of code for parent...
while child:
...block of code for child...
...variable for block insertion...
...statement at end of child block...
...statement at end of parent block...
...statement at end of parent/child block...
与next()
类似,但是使用专有模块需要使用它。
因此,将使用映射器让程序知道使用此结构创建多少个嵌套while循环。我还没有插入嵌套的块,但是我知道可以做到。 :)
我想向可以解释如何创建映射器部分的人学习。
谢谢!
答案 0 :(得分:1)
d = {
'A': ['Blue'],
'B': ['A'],
'C': ['A'],
'D': ['C'],
}
output = {}
for k, v in d.items():
output[v[0]] = output.get(v[0], [])
output[v[0]].append(k)
output
#=> {'Blue': ['A'], 'A': ['C', 'B'], 'C': ['D']}
答案 1 :(得分:1)
此代码修改您现有的子级:父级词典,将深度标记添加到每个列表的末尾。无论按什么顺序处理键,它都能正常工作(在Python 2和Python 3中)。在Python 3.6之前的版本中,词典不一定保留键的插入顺序,并且键顺序可以从一个改变程序运行到下一个。因此,我对条目进行了一些打乱,以确保它的行为符合预期。
src = {
'D': ['C'],
'B': ['A'],
'A': ['Blue'],
'C': ['A'],
}
def get_depth(d, k):
v = d[k]
if len(v) == 2:
return v[1]
else:
parent = v[0]
depth = 0 if parent == 'Blue' else get_depth(d, parent) + 1
v.append(depth)
return depth
for k in src:
get_depth(src, k)
print(src)
Python 3.6输出
{'D': ['C', 2], 'B': ['A', 1], 'A': ['Blue', 0], 'C': ['A', 1]}
答案 2 :(得分:0)
我不确定我是否完全了解预期的输出,但这还是有帮助的
for key, value in d.items():
if value[0] == 'Set':
if len(value) == 1:
value.extend([0])
elif len(value) >= 2:
continue
elif value[0] in d.keys():
newlevel = d[value[0]][1] + 1
value.extend([newlevel])