Skip to main content
 首页 » 编程设计

Python语法。美丽,正确,简短的代码

2025年05月04日1552php

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) 具有相同的效果;根据需要产生新的值(value)。

这两种方法都适用于生成列表或集合,而不是生成具有 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 的字典。