克隆策略

字典(dictionary)

字典在某些语言中可能称为 联合内存 (associative memories) 或 联合数组 (associative arrays)。序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。如果元组中只包含字符串和数字,它可以作为关键字,如果它直接或间接地包含了可变对象,就不能当做关键字。不能用列表做关键字,因为列表可以用索引、切割或者 append() 和 extend() 等方法改变。

字典是无序的键:值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。使用大括号创建一个空的字典:{}。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。

字典的主要操作是依据键来存储和取值。也可以用 del 来删除键:值对(key:value),从一个不存在的键中取值会导致错误。

In [1]:
# 房价的一个例子
house_price = {'beijing': 60980, 'shenzhen': 49390, 'haikou':24000}
house_price['chengdu'] = 12000
print('存储房价信息的字典:', house_price)
print( '海口的房价为:', house_price['haikou'])
存储房价信息的字典: {'beijing': 60980, 'chengdu': 12000, 'shenzhen': 49390, 'haikou': 24000}
海口的房价为: 24000
In [2]:
del house_price['haikou']
house_price['shanghai'] = 50000
print(house_price)
print(house_price.keys())
print('chengdu' in house_price)
print('hefei' in house_price)
{'beijing': 60980, 'chengdu': 12000, 'shenzhen': 49390, 'shanghai': 50000}
dict_keys(['beijing', 'chengdu', 'shenzhen', 'shanghai'])
True
False

常见字典操作方法

D.clear()删除字典内所有元素

D.copy()返回一个字典的复制

D.fromkeys(seq,val)创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

D.get(key, default=None)返回指定键的值,如果值不在字典中返回default值

D.has_key(key)如果键在字典dict里返回true,否则返回false

D.items()以列表返回可遍历的(键, 值) 元组数组

D.keys()以列表返回一个字典所有的键

D.setdefault(key, default=None)和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

D.update(dict2)把字典dict2的键/值对更新到dict里

D.values()以列表返回字典中的所有值

D.pop(key)删除一个键并返回它的值,类似于列表的pop,只不过删除的是一个键不是一个可选的位置

del D[key]删除键

D[key] = 42新增或修改键

字典用法注意事项:

  1. 序列运算无效,字典元素间是没有顺序的概念

  2. 对新索引赋值会添加项

  3. 键不一定总是字符串

In [3]:
print('北京房价', house_price.get('beijing', 0)) #返回指定键的值,如果值不在字典中返回default值
print('重庆房价', house_price.get('chongqing', 0))
北京房价 60980
重庆房价 0

多种构造字典方式

dict() 构造函数可以直接从 key-value 对中创建字典

In [4]:
# 另外一种构造字典的方式
dict([('beijing', 60980), ('shenzhen', 49390), ('haikou', 24000)])
Out[4]:
{'beijing': 60980, 'haikou': 24000, 'shenzhen': 49390}
In [5]:
dict.fromkeys(['a','b'],0) #创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
Out[5]:
{'a': 0, 'b': 0}
In [6]:
dict(zip(['beijing','shenzhen','haikou'],[60980,49390,24000]))
Out[6]:
{'beijing': 60980, 'haikou': 24000, 'shenzhen': 49390}
In [7]:
{k:v for (k,v) in zip(['beijing','shenzhen','haikou'],[60980,49390,24000])}
Out[7]:
{'beijing': 60980, 'haikou': 24000, 'shenzhen': 49390}
In [8]:
# 通过字典推导式构造字典
{x: x**2 for x in (2, 4, 6)}
Out[8]:
{2: 4, 4: 16, 6: 36}
In [9]:
{c:c*4 for c in 'bigQuant'}#默认是集合
Out[9]:
{'Q': 'QQQQ',
 'a': 'aaaa',
 'b': 'bbbb',
 'g': 'gggg',
 'i': 'iiii',
 'n': 'nnnn',
 't': 'tttt',
 'u': 'uuuu'}
In [10]:
dict(a=1,b=2,c=3)
Out[10]:
{'a': 1, 'b': 2, 'c': 3}
In [11]:
{c.lower():c*4+'!' for c in 'bigQuant'}
Out[11]:
{'a': 'aaaa!',
 'b': 'bbbb!',
 'g': 'gggg!',
 'i': 'iiii!',
 'n': 'nnnn!',
 'q': 'QQQQ!',
 't': 'tttt!',
 'u': 'uuuu!'}