字典与集合

2018 年 10 月 12 日 • 阅读数: 89

dict

Mapping的abc继承关系

MutableMapping.png

字典的常用操作

  • clear 清空字典的全部数据
  • copy 浅拷贝(只会拷贝第一层数据结构,嵌套的数据其实保存的是一个地址)
  • fromkeys @staticmethod 通过一个iterable转换成一个dict
  • get 和直接取值相比不会因为没有对应的数据而抛 KeyError 的异常
  • items 返回一个元组的集合
  • setdefault 获取一个值,如果获取不到,则添加这个值
  • update 添加数据从一个dict/iterable
d = {'root':{'name':'ly','age':21},'other':{'name':'some','age':None}}
""" D.clear() -> None.  Remove all items from D. """
d.clear()
d
{}
""" D.copy() -> a shallow copy of D """
new_dict = d.copy()
new_dict['other']['age'] = 20
print(new_dict)
print(d)
{'root': {'name': 'ly', 'age': 21}, 'other': {'name': 'some', 'age': 20}}
{'root': {'name': 'ly', 'age': 21}, 'other': {'name': 'some', 'age': 20}}
"""深拷贝需要借助python的标准库copy"""
import copy
new_dict = copy.deepcopy(d)
new_dict['other']['age'] = 20
print(new_dict)
print(d)
{'root': {'name': 'ly', 'age': 21}, 'other': {'name': 'some', 'age': 20}}
{'root': {'name': 'ly', 'age': 21}, 'other': {'name': 'some', 'age': None}}
""" Returns a new dict with keys from iterable and values equal to value. """
new_list = ['wmm','zxy']
new_dict = dict.fromkeys(new_list,{'age':22})
print(new_dict)
{'wmm': {'age': 22}, 'zxy': {'age': 22}}
""" D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None. """
new_dict.get('wmm')
{'age': 22}
""" D.items() -> a set-like object providing a view on D's items """
for key,value in new_dict.items():
    print(key,value)
wmm {'age': 22}
zxy {'age': 22}
""" D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
new_dict.setdefault('wjl',{'age':21})
print(new_dict)
{'wmm': {'age': 22}, 'zxy': {'age': 22}, 'wjl': {'age': 21}}
"""
D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
In either case, this is followed by: for k in F:  D[k] = F[k]
"""
new_dict.update({'ly':{'age':20}})
print(new_dict)
{'wmm': {'age': 22}, 'zxy': {'age': 22}, 'wjl': {'age': 21}, 'ly': {'age': 20}}

dict的子类

  • python 中的 dict 源码使用c语言写的,所以不建议直接继承 dict
  • 而 collections 模块中的 UserDict 是用python语言重写的一个 dict
  • 如果要继承 dict 建议使用 UserDict

对象转字典

class User(object):
    name = 'amor'
    age = 20
    
    def __init__(self):
        self.gender = 'male'
        
    def keys(self):
        return ('name', 'age', 'gender')
    
    def __getitem__(self, item):
        return getattr(self, item)
    
o = User()
dict(o)
{'name': 'amor', 'age': 20, 'gender': 'male'}

set和frozenset

  • set是一个无序的不重复的
  • frozenset是一个不可变长的set

set的常用操作

  • 算术运算 | & -
  • add 添加数据
  • clear 清空所有数据
  • copy 浅拷贝
  • update 更新set
  • difference 差集相当于 -
  • issubset 判断是否是字串
"""
Add an element to a set.
This has no effect if the element is already present.
"""
s = {'a','b','c','d'}
s.add('e')
print(s)
{'b', 'c', 'd', 'e', 'a'}
""" Remove all elements from this set. """
s.clear()
print(s)
set()
""" Return a shallow copy of a set. """
new_set = s.copy()
print(new_set)
{'b', 'c', 'd', 'e', 'a'}
""" Update a set with the union of itself and others. """
s.update({'l','y','x'})
print(s)
{'b', 'c', 'd', 'l', 'e', 'a', 'y', 'x'}
"""
Return the difference of two or more sets as a new set.
(i.e. all elements that are in this set but not the others.)
"""
res = s.difference({'b','d','e','r'})
print(res)
{'a', 'c'}
""" Report whether another set contains this set. """
a = {1,2,3,4,5,6}
b = {1,2,3}
b.issubset(a)
True

dict和set的实现原理

  • dict查找的性能远远大于list
  • 在list中随着list数据的增大,查找时间会增大
  • 在dict中查找元素不会随着数据的增大而增大
  • dict和set内部是通过哈希表来实现的
  • 应为需要通过hash还实现哈希表,所以dict的key必须是可hash的
  • 一般不可变对象都是可哈希的,自定义类的时候实现__hash__方法也可以
  • dict的内存花销大,但是查询速度快,自定义的对象或者python内部的对象都是用dict包装的
  • dict的存储顺序和元素添加顺序有关,添加数据也有可能改变已有数据的顺序

hash.png

标签: Python数据结构

召唤伊斯特瓦尔