这个字典结构:
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
答案 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.setdefault
与dict.get
类似,不同之处在于它针对键设置默认值并返回与键对应的值。