2014-01-08 28 views
0

我有一个问题,我希望你能帮助我。我有以下的解释:在pythons字典中查找关联的“孩子/父母”

{ 
    '100': {'name': Glenn,'age': 25,'cars': 2}, 
    '101': {'name': Glenn,'age': 25,'cars': 2,'children': ['105', '102']}, 
    '102': {'name': Glenn,'age': 25,'cars': 2,'children': ['103']}, 
    '103': {'name': Glenn,'age': 25,'cars': 2}, 
    '104': {'name': Glenn,'age': 25,'cars': 2,'children': ['105', '102']}, 
    '105': {'name': Glenn,'age': 25,'cars': 2,'children': ['124']}, 
    '106': {'name': Glenn,'age': 25,'cars': 2}, 
    '107': {'name': Glenn,'age': 25,'cars': 2,'children': ['199']}, 
    } 

的任务是:在这个列表中的每个条目,找出他们是否有此列表中的父母,如果是的话,使他们的字典中的条目与parent: ['101','104']

如您所见,有些人在此列表中没有父级,因此不应该添加此“父级”条目。而其他人有孩子不在名单上,那些孩子被忽视,因为我们没有关于他们的信息。

我曾尝试以下:

 def addParentInfo(patients): 
     for pkey, pvalue in patients.items(): 
      for pkey2,pvalue2 in patients.items(): 
       if pkey in pvalue["children"]: 
        pvalue[parent] = [pkey2] 

但似乎这样无组织的,我不知道该怎么走“的名单之外的孩子”的护理问题,而当一个人有两个父在列表中,我应该将它们添加到列表中,而不是重置pvalue [parent]。

那么有人可以教我如何使这个有效和顺利? :)

回答

1

事情是这样的:

import pprint    

for k, v in data.items(): #data is the main dictionary 
    if 'children' in v: 
     for child in v['children']: 
      if child in data: 
       data[child].setdefault('parent', []).append(k) 

pprint.pprint(data)  

输出:

{'100': {'age': 25, 'cars': 2, 'name': 'Glenn'}, 
'101': {'age': 25, 'cars': 2, 'children': ['105', '102'], 'name': 'Glenn'}, 
'102': {'age': 25, 
     'cars': 2, 
     'children': ['103'], 
     'name': 'Glenn', 
     'parent': ['101', '104']}, 
'103': {'age': 25, 'cars': 2, 'name': 'Glenn', 'parent': ['102']}, 
'104': {'age': 25, 'cars': 2, 'children': ['105', '102'], 'name': 'Glenn'}, 
'105': {'age': 25, 
     'cars': 2, 
     'children': ['124'], 
     'name': 'Glenn', 
     'parent': ['101', '104']}, 
'106': {'age': 25, 'cars': 2, 'name': 'Glenn'}, 
'107': {'age': 25, 'cars': 2, 'children': ['199'], 'name': 'Glenn'}} 
+0

是否可以这样做,以便父级信息在列表中,而不是在一个集合中? :) – Nick

+0

@Nick是的,只是使用:'setdefault('parent',[])。appendd(k)' –

+0

谢谢,那只是我正在寻找的解决方案。感谢您的时间和帮助:) – Nick

1
def addParentInfo(patients): 
    for k, v in patients.items(): 
     for ck in v.get('children', []): 
      if ck in patients: 
       patients[ck].setdefault('parent', []).append(k) 
0

假设d是你原来的字典,这字典理解应该做的伎俩:

d = {k: {k: v for k, v in v.items() if v} 
    for k, v in d.items() if v.__setitem__('parents', 
    [p for p, v in d.items() if 'children' in v and k in v['children']]) or True}