12/20
2015
【Python 2.7 3.1 新特 性】字典推导式(Dictionary comprehensions)
L = [1,2,3,4,5,6,7,8,9]

要生成下面这样的字典:

{1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90}

以前需要这样:

dict([(v, v*10) for v in L])

现在可以直接这样:

{v: v*10 for v in L}

附录:

一、什么是字典?

字典是Python语言中唯一的映射类型。
映射类型对象里哈希值和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。
字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。

字典类型与序列类型的区别:
存取和访问数据的方式不同。
序列类型只用数字类型的键(从序列的开始按数值顺序索引);
映射类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,映射类型的键直接或间接地和存储数据值相关联。
映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
映射类型用键直接“映射”到值。

字典是Python中最强大的数据类型之一。

二、如何创建字典和给字典赋值

简单地说字典就是用大括号包裹的键值对的集合。(键值对也被称作项)

一般形式:

adict = {}
adict = {key1:value2, key2:value2, …}

或用dict()函数,如,adict = dict()adict = dict((['x',1],['y',2]))
关键字参数创建字典,如:

>>> adict = dict(name = 'allen', age = 40)
>>> adict
{'age': 40, 'name': 'allen'}

或用fromkeys()方法,如:

>>> adict = {}.fromkeys(('x', 'y'), -1)
>>> adict
{'y': -1, 'x': -1}
>>> 

>>> adict = {}.fromkeys(('x', 'y', -1))
>>> adict
{'y': None, 'x': None, -1: None}

特点:
1、键与值用冒号“”分开;
2、项与项用逗号“”分开;
3、字典中的键必须是唯一的,而值可以不唯一。

>>> adict = {'name': 'allen', 'name': 'lucy', 'age': '40'}
>>> adict
{'age': '40', 'name': 'lucy'}
>>> bdict = {'name': 'allen', 'name2': 'allen', 'age': '40'}
>>> bdict
{'age': '40', 'name2': 'allen', 'name': 'allen'}

三、字典的基本操作

1、如何访问字典中的值?

>>> bdict['age']
32
>>> bdict['age2']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'age2'

2、如何检查key是否在字典中?

a、has_key()方法

>>> bdict.has_key('age')
True
>>> bdict.has_key('age2')
False

b、innot in

>>> 'age' in bdict
True
>>> 'age2' in bdict
False

3、如何更新字典?

a、添加一个数据项(新元素)或键值对

>>> bdict
{'age': 32, 'name2': 'allen', 'name': 'allen'}
>>> bdict['address'] = 'address'
>>> bdict
{'age': 32, 'name2': 'allen', 'name': 'allen', 'address': 'address'}

b、更新一个数据项(元素)或键值对

>>> bdict
{'age': 32, 'name2': 'allen', 'name': 'allen', 'address': 'address'}
>>> bdict['age'] = 40
>>> bdict
{'age': 40, 'name2': 'allen', 'name': 'allen', 'address': 'address'}

c、删除一个数据项(元素)或键值对

>>> bdict
{'age': 40, 'name2': 'allen', 'name': 'allen', 'address': 'address'}
>>> del bdict['age']
>>> bdict
{'name2': 'allen', 'name': 'allen', 'address': 'address'}
>>> bdict.pop('name2')
'allen'
>>> bdict
{'name': 'allen', 'address': 'address'}

>>> del bdict
>>> bdict
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'bdict' is not defined

四、映射类型操作符

标准类型操作符(+-*<,>,<=,>=,==,!=,and,or, not)
a、字典不支持拼接和重复操作符(+*

>>> adict = {'age' : 30}
>>> bdict = {'age' : 40}
>>> adict < bdict
True
>>> adict > bdict
False
>>> adict <= bdict
True
>>> adict >= bdict
False
>>> adict and bdict
{'age': 40}
>>> adict or bdict
{'age': 30}
>>> not adict 
False

b、字典的比较操作
1.先比较字典的长度也就是字典的元素个数
2.键比较 3.值比较 例子:

>>> adict = {}
>>> bdict = {'age': 30}
>>> cmp(adict, bdict)
-1
>>> adict = {'age' : 30}
>>> cmp(adict, bdict)
0
>>> adict = {'age' : 30, 'name' : 'name'}
>>> cmp(adict, bdict)
1

五、映射相关的函数

1、len() 返回字典的长度
2、hash() 返回对象的哈希值,可以用来判断一个对象能否用来作为字典的键
3、dict() 工厂函数,用来创建字典

六、字典的方法

1、adict.keys() 返回一个包含字典所有KEY的列表;
2、adict.values() 返回一个包含字典所有value的列表;
3、adict.items() 返回一个包含所有(键,值)元祖的列表;
4、adict.clear() 删除字典中的所有项或元素;
5、adict.copy() 返回一个字典浅拷贝的副本;
6、adict.fromkeys(seq, val=None) 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(默认为None);
可惜这个方法有局限性,比如我希望给每个key值都赋予独一无二的value:

>>> adict.fromkeys([1,2,3], ['1', '2', '3'])
{1: ['1', '2', '3'], 2: ['1', '2', '3'], 3: ['1', '2', '3']}

是办不到的
7、adict.get(key, default = None) 返回字典中key对应的值,若key不存在字典中,则返回default的值(default默认为None);
8、adict.has_key(key) 如果key在字典中,返回True,否则返回False。 现在用innot in
9、adict.iteritems()adict.iterkeys()adict.itervalues() 与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表;
10、adict.pop(key[,default]) get方法相似。如果字典中存在key,删除并返回key对应的vuale;如果key不存在,且没有给出default的值,则引发keyerror异常;
11、adict.setdefault(key, default=None)set()方法相似,但如果字典中不存在Key键,由adict[key] = default为它赋值;
12、adict.update(bdict) 将字典bdict的键值对添加到字典adict中。

七、字典的遍历

1、遍历字典的key(键)

>>> adict = {'name': 'name', 'age': 20}
>>> for key in adict.keys():
...     print key
... 
age
name

2、遍历字典的value(值)

>>> for value in adict.values():
...     print value
... 
20
name

3、遍历字典的项(元素)

>>> for item in adict.items():
...     print item
... 
('age', 20)
('name', 'name')

4、遍历字典的key-value

>>> for item, value in adict.items():
...     print 'key = %s, value = %s' %(item, value)
... 
key = age, value = 20
key = name, value = name
>>> for item, value in adict.iteritems():
...     print 'key = %s, value = %s' %(item, value)
... 
key = age, value = 20
key = name, value = name

八、使用字典的注意事项

1、不能允许一键对应多个值;
2、键必须是可哈希的。