for item in listOfModels:
if item[0] in perms:
perms[item[0]][item[1]] = True
else:
perms[item[0]] = {item[1]: True}
我经常使用这样的代码。请告诉我美丽,简短,正确的方法。
(图书馆,书籍,样品等)
例如。
我有
[
['animal', 'rabbit'],
['animal', 'cow'],
['plant', 'tree'],
['animal', 'elephant'],
['fruit', 'strawberry'],
['fruit', 'apple'],
]
和需要
{
'animal': ['rabbit', 'cow', 'elephant'],
'plant': ['tree'],
'fruit': ['strawberry', 'apple'],
}
要么
{
'animal': {
'rabbit': True,
'cow': True,
'elephant': True
},
'plant': {
'tree': True
},
'fruit': {
'strawberry': True,
'apple': True
},
最佳答案
两个选项:使用dict.setdefault()
或使用collections.defaultdict()
object。
使用dict.setdefault()
:
for category, name in listOfModels:
perms.setdefault(category, {})[name] = True
或使用
defaultdict
:from collection import defaultdict
perms = defaultdict(dict)
for category, name in listOfModels:
perms[category][name] = True
dict.setdefault()
为您查找密钥,如果缺少密钥,则使用第二个参数来设置值。这样,您总是可以得到一本字典(甚至是空字典),然后可以在其上设置name
键。defaultdict
带有工厂参数,每当您尝试访问的键丢失时,都会调用工厂以产生默认值。因此,访问perms['missing_key']
与使用perms.set_default('missing_key', default)
具有相同的效果。根据需要产生新的价值。两种方法都可以轻松地产生列表或集合,而不是具有
True
值的字典:# producing a list
for category, name in listOfModels:
perms.setdefault(category, []).append(name)
# or a set
for category, name in listOfModels:
perms.setdefault(category, set()).append(name)
# same with defaultdict
perms = defaultdict(list)
for category, name in listOfModels:
perms[category].append(name)
perms = defaultdict(set)
for category, name in listOfModels:
perms[category].add(name)
在这里,设置可能是最好的选择,将值直接设置为
True
等同于字典。