Python语法.美丽,正确,短代码

ubo*_*mbi 1 python iteration

for item in listOfModels:
    if item[0] in perms:
        perms[item[0]][item[1]] = True
    else:
        perms[item[0]] = {item[1]: True}
Run Code Online (Sandbox Code Playgroud)

我经常使用这样的代码.请告诉我美丽,简短,正确的方法.

(lib,书籍,样本等)

我有

[
    ['animal', 'rabbit'],
    ['animal', 'cow'],
    ['plant', 'tree'],
    ['animal', 'elephant'],
    ['fruit', 'strawberry'],
    ['fruit', 'apple'],
]
Run Code Online (Sandbox Code Playgroud)

和需要

{
    'animal': ['rabbit', 'cow', 'elephant'],
    'plant': ['tree'],
    'fruit': ['strawberry', 'apple'],
}
Run Code Online (Sandbox Code Playgroud)

要么

{
'animal': {
    'rabbit': True,
    'cow': True,
    'elephant': True
},
'plant': {
    'tree': True
},
'fruit': {
    'strawberry': True,
    'apple': True
},
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

两个选项:使用dict.setdefault()或使用collections.defaultdict()对象.

使用dict.setdefault():

for category, name in listOfModels:
    perms.setdefault(category, {})[name] = True
Run Code Online (Sandbox Code Playgroud)

或使用defaultdict:

from collection import defaultdict

perms = defaultdict(dict)
for category, name in listOfModels:
    perms[category][name] = True
Run Code Online (Sandbox Code Playgroud)

dict.setdefault()为您查找键,如果它丢失则使用第二个参数来设置值.这样,你总是拿到一本字典背(即使是空的),可以在其上再设置name键.

A 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)
Run Code Online (Sandbox Code Playgroud)

集合可能是这里的最佳选择,是值设置为的字典的直接等价物True.