不变对象dict(字典)和 set
dict
1.dict基本用法
dict 是字典的意思,就是把数据存在一个字典里面,查找也和字典一样方便。
例如:
name={'anqi': 1,'anqijiang': 2,'zhouanqi': 3}
print(name['anqijiang'])
结果:
2
一个key对应一个value,且一但初始化便不能改变。dict的key必须是不可变对象 。
2.dict如何避免key不存在编译器报错
使用defaultdict
在没有key
的时候会返回一个默认值:N/A
,其余和dict
相同
defaultdict
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'
3.将两个列表组合成一个字典
若无需排序可以使用:zip
:
>>> name=['zaq', 'xsw', 'cde']
>>> poker=[[1,2],[3,4],[5,6]]
>>> dictr=dict(zip(name,poker)
>>> dictr
{'xsw': [3, 4], 'cde': [5, 6], 'zaq': [1, 2]}
4.字典有序排列–模块:OrdereDict
collections.OrderedDict()
可以实现有序排列字典
d1 = collections.OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'
d1['1'] = '1'
d1['2'] = '2'
for k,v in d1.items():
print k,v
输出:
Order dictionary
a A
b B
c C
1 1
2 2
5.先进先出dict
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
其余用法与dict相同
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。
重复的元素在set中自动被过滤。再次添加也没有效果。
因为dict和set存放的是 不可变量,所以将可变量放入dict或者是set 皆不可行。
看一组代码:
>>> tuple1=(1,2,3) #这是一个数组,其值不可变
>>> dict1={'tuple1':tuple1} #把这个数组放入字典中
>>> dict1 #可执行成功
{'tuple1': (1, 2, 3)}
>>> set1={tuple1} #放入set中
>>> set1 #可执行成功
{(1, 2, 3)}
>>> tuple2=(1,[2,3]) #数组2,其元素中包括一个整形和一个列表,列表是可变对象
>>> dict2={'tuple2':tuple2} #因为dict中只有key是不可变对象
>>> dict2 #所以dict2可以执行
{'tuple2': (1, [2, 3])}
>>> set2={tuple2} #set整个存储的都是不可变对象,所以不可以执行
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
set2={tuple2}
TypeError: unhashable type: 'list'