字典推导
和列表推导类似,字典同样可以推导:
teams = ["Packers", "49ers", "Ravens", "Patriots"]
print {key: value for value, key in enumerate(teams)}
>>> {'49ers': 1, 'Ravens': 2, 'Patriots': 3, 'Packers': 0}
从字典中获取元素
使用字典的 get 方法可以安全的获得字典的值,第二个参数是缺省值:
data = {'user': 1, 'name': 'Max', 'three': 4}
is_admin = data.get('admin', False)
在 Dictionary 中元素分组
和上面类似,先创建 Persons:
class Person(object):
def __init__(self, age):
self.age = age
persons = [Person(age) for age in (78, 14, 78, 42, 14)] 如果现在我们要按照年龄分组的话,一种方法是使用 in 操作符:
persons_by_age = {}
for person in persons:
age = person.age
if age in persons_by_age:
persons_by_age[age].append(person)
else:
persons_by_age[age] = [person]
assert len(persons_by_age[78]) == 2
相比较之下,使用 collections 模块中 defaultdict 方法的途径可读性更好:
from collections import defaultdict
persons_by_age = defaultdict(list)
for person in persons:
persons_by_age[person.age].append(person)
defaultdict 将会利用接受的参数为每个不存在的 key 创建对应的值,这里我们传递的是 list,所以它将为每个 key 创建一个 list 类型的值。 假如需要建立嵌套的defaultdict,d = defaultdict(defaultdict)行不通,正确的方法是d = defaultdict(lambda :defaultdict(int))。
list 转 dict
将 [‘1:a’,‘2:b’,‘3:c’] 转换为 {‘1′: ‘a’, ‘3′: ‘c’, ‘2′: ‘b’}:
dict(item.split(':')[:2] for item in b)
dict 转 class
方法如下:
class Struct:
def __init__(self, **entries):
for k, v in entries.items():
if isinstance(v, dict):
entries[k] = Struct(**v)
print entries[k]
self.__dict__.update(entries)
if __name__ == '__main__':
args = {'a': {'cola': ['xm', 'xb']},
'b': 2}
s = Struct(**args)
print s.a
print s.a.cola
print s.b