2016-09-01 88 views
4

這種字典結構:變換字典對象

data = { 
    'a': { 'category': ['c', 'd'] }, 
    'b': { 'category': ['c', 'd'] } 
} 

應該成爲本字典結構:

data = { 
    'c' : ['a', 'b'], 
    'd' : ['a', 'b'] 
} 

我有以下做法:

for key, value in data.items(): 
    if isinstance(value, dict): 
     if 'category' in value: 
      for cat in value['category']: 
       if cat in categories: 
        categories[cat].append(key) 
       else: 
        categories[cat] = [key] 

我想知道是否有任何簡化我的方法。我使用Python 3.5

回答

2
if 'category' in value: 

此行確保關鍵category在字典中,使用前它。然後你從字典中獲得對應於category的值並重復它。您可以使用dict.get方法來簡化此操作,如果該鍵不在字典中,該方法將返回默認值。所以,你可以做這樣的事情

for cat in value.get('category', []): 

如果category不存在於字典,則返回一個空列表和循環也就沒什麼可迭代。


同樣的,你正在檢查,如果關鍵的categories字典存在,如果沒有,設置默認值(這是一個列表)。您可避免if...else也與dict.setdefault,這樣

categories = {} 
for key, value in data.items(): 
    if isinstance(value, dict): 
     for cat in value.get('category', []): 
      categories.setdefault(cat, []).append(key) 

dict.setdefault類似於dict.get,不同之處在於它設置對鍵的默認值,並返回相應的鍵的值。

4

您可以用defaultdict(list)解決它,遍歷類別和附加鍵:

>>> from collections import defaultdict 
>>> 
>>> d = defaultdict(list) 
>>> for key, value in data.items(): 
...  for item in value['category']: 
...   d[item].append(key) 
... 
>>> dict(d) 
{'c': ['a', 'b'], 'd': ['a', 'b']} 
+0

附加導入:( – Skeec

+0

@Skeec so?它帶來了更可讀的實現。此外,它是一個內置的,它始終可用。 –

+0

請問這是如何工作的? – Skeec