2014-01-08 48 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}