转换字典对象

时间:2016-09-01 16:22:03

标签: python python-3.x dictionary

这个字典结构:

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 个答案:

答案 0 :(得分: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']}

答案 1 :(得分: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.setdefaultdict.get类似,不同之处在于它针对键设置默认值并返回与键对应的值。