Python 语法。美丽,正确,简短的代码
Python syntax. Beautiful, right, short code
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()
or use a 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
键。
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)
集合可能是这里最好的选择,它直接等同于值设置为 True
.
的字典
使用setdefault
方法。
for item in listOfModels:
perms.setdefault(item[0], {})[item[1]] = True
如果你知道每一项恰好有两个元素,你可以进一步缩短为
for item0, item1 in listOfModels:
perms.setdefault(item0, {})[item1] = True
如果你想和itertools
一起疯狂:
import operator, itertools
first = operator.itemgetter(0)
second = operator.itemgetter(1)
grouped = itertools.groupby(sorted(listOfModels, key=first), key=first)
result = dict((kind, map(second, examples)) for kind, examples in grouped)
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()
or use a 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
键。
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)
集合可能是这里最好的选择,它直接等同于值设置为 True
.
使用setdefault
方法。
for item in listOfModels:
perms.setdefault(item[0], {})[item[1]] = True
如果你知道每一项恰好有两个元素,你可以进一步缩短为
for item0, item1 in listOfModels:
perms.setdefault(item0, {})[item1] = True
如果你想和itertools
一起疯狂:
import operator, itertools
first = operator.itemgetter(0)
second = operator.itemgetter(1)
grouped = itertools.groupby(sorted(listOfModels, key=first), key=first)
result = dict((kind, map(second, examples)) for kind, examples in grouped)