亲子地图的Python字典

时间:2018-09-18 15:24:00

标签: python dictionary

我在建立父子标记的字典方面遇到了困难。

我有一本这样的字典:

d = {
'A': ['Blue'],
'B': ['A'],
'C': ['A'],
'D': ['C'],
}

这是我的逻辑或思考过程:如果键是'Blue',则它是父键,并得到0的标志。如果valued.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]

DC的孙代,应具有2的标志,而CA的子代,其值应为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循环。我还没有插入嵌套的块,但是我知道可以做到。 :)

我想向可以解释如何创建映射器部分的人学习。

谢谢!

3 个答案:

答案 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])