字典是一种集合,但它不是序列。字典经常被视为映射集合,有时又被视为关联数组。字典可以看作成对元素构成的列表,其中每对中的第一个元素是键,每对中的第二个元素是值。在搜索字典时,首先查找键,然后才是关联的值。
1、创建
字典的构造函数是dict,快捷方式是花括号{ }。
当指定字典的内容时,单个的键值对由冒号(:)隔开。
>>> # dict函数创建
>>> items=[('name','Gumby'),('age',42)]
>>> d1=dict(items)
>>> d1
{'age': 42, 'name': 'Gumby'}
>>> d2=dict(name='Gumby',age=42)
>>> d2
{'age': 42, 'name': 'Gumby'}
>>>
>>> # {}创建
>>> contacts={'bill':'353-1234','rich':'269-1234','jane':'352-1234'}
>>> contacts # 字典中的元素是无序的
{'jane': '352-1234', 'bill': '353-1234', 'rich': '269-1234'}
空字典的两种创建方式:
>>> oneDict={} # 一对花括号{}创建
>>> oneDict
{}
>>> anotherDict=dict() # 使用不带参数的构造函数dict创建
>>> anotherDict
{}
注意事项:
(1)值可以是任何对象,但键只能是不可改变的对象(如,整数、字符串或元组)。
>>> dict1={['Name']:'Zara','Age':7]} # 列表作为键
SyntaxError: invalid syntax
>>> dict1={['Name']:'Zara','Age':7} # 列表作为键
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
dict1={['Name']:'Zara','Age':7} # 列表作为键
TypeError: unhashable type: 'list'
>>>
>>> dict2={'Name':'Zara','Age':[1,2,3]} # 列表作为值
>>>
(2)键在一个字典中是唯一的,而值可能不是。
>>> dict3={'Name':'Zara','Age':[1,2,3],'Name':'Manni'}
>>> dict3['Name'] # 键重复,后一个值会被记住
'Manni'
2、索引和赋值
字典不使用顺序的数字(0为第一个元素,-1为最后一个元素,以此类推)作为索引,而是使用键作为索引值。
也可以通过对索引赋值来在字典中添加键值对。
(1)字典是可变的
在字典中可以对索引赋值,因此字典是第二个可变数据结构(第一个是列表)的例子。
>>> contacts={'bill':'353-1234','rich':'269-1234','jane':'352-1234'}
>>> contacts['rich']='467-1234' # 通过键修改值
>>> contacts
{'jane': '352-1234', 'bill': '353-1234', 'rich': '467-1234'}
>>> contacts['barb']='271-1234' # 添加新的键值对(注:键不能重复)
>>> contacts
{'jane': '352-1234', 'bill': '353-1234', 'barb': '271-1234', 'rich': '467-1234'}
可以删除单个字典元素或清除字典中的全部内容。要删除整个字典,只要用del语句。
>>> contacts={'bill':'353-1234','rich':'269-1234','jane':'352-1234'}
>>> del contacts['bill'] # 删除键位‘bill’的元素
>>> contacts
{'jane': '352-1234', 'rich': '269-1234'}
>>> del contacts # 删除整个字典
>>> contacts
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
contacts
NameError: name 'contacts' is not defined
>>>
(2)字典中不同的键类型
字典有两个优势:第一个优势是索引速度快;第二个优势是值可以为任何类型的数据结构(甚至是另一个字典集合)。
键可以是任何类型的不可变对象,不同类型的键可以用于同一字典中。
>>> demo={2:['a','b','c'],(2,4):27,'x':{1:2.5,'a':3}}
>>> demo
{'x': {'a': 3, 1: 2.5}, 2: ['a', 'b', 'c'], (2, 4): 27}
>>> demo[2] # 键:整数 值:列表
['a', 'b', 'c']
>>> demo[(2,4)] # 键:元组 值:整数
27
>>> demo['x'] # 键:字符串 值:字典
{'a': 3, 1: 2.5}
>>> demo['x'][1] # 就相当于二维字典
2.5
3、运算符
3.1 集合操作
牢记:在字典的键值对中,键是关键,且字典是可变的。
[ ]:在方括号中使用索引值
len():“长度”是指字典中的键值对的个数
in:成员测试,得到布尔值,键是否在字典中(而不是值)
for:通过键在字典中进行循环
>>> myDict={'a':32,3:['x','y'],'joe':'smith'}
>>> myDict
{'a': 32, 3: ['x', 'y'], 'joe': 'smith'}
>>> myDict['a'] # 索引
32
>>> len(myDict) # 字典长度
3
>>> 'a' in myDict # 键是否在字典中
True
>>> 32 in myDict # in只用于键,不用于值
False
>>> for key in myDict:
print key,
a 3 joe
>>> for key in myDict:
print key,myDict[key]
a 32
3 ['x', 'y']
joe smith
>>>
3.2 字典方法
以下4种方法对字典特别有用,尤其是在字典中进行循环时。
items():所有键值对的元组列表
keys():所有键的列表
values():所有值的列表
copy():浅拷贝的字典
>>> myDict={'a':32,3:['x','y'],'joe':'smith'}
>>> for key,val in myDict.items():
print key,val
a 32
3 ['x', 'y']
joe smith
>>>
>>> myDict.keys()
['a', 3, 'joe']
>>> for key in myDict.keys():
print key,
a 3 joe
>>>
>>> myDict.values()
[32, ['x', 'y'], 'smith']
>>> for val in myDict.values():
print val,
32 ['x', 'y'] smith
>>>
>>> newDict=myDict.copy() # 浅拷贝
>>> newDict['a']=7
>>> newDict
{'a': 7, 3: ['x', 'y'], 'joe': 'smith'}
>>> myDict # 键———不可变的对象
{'a': 32, 3: ['x', 'y'], 'joe': 'smith'}
>>> newDict[3][0]='z'
>>> myDict # 索引————可变对象
{'a': 32, 3: ['z', 'y'], 'joe': 'smith'}
4、Python指针:使用zip创建字典
zip是一个非常有趣且有用的运算符,它从两个序列中创建成对的元素。zip运算符像拉链一样,将多个序列合并成元组列表。它不是专门为字典而设置的,但与dict构造函数结合,能提供创建序列字典的有效方法。
>>> keys=["red","white","blue"]
>>> values=[100,300,500]
>>> d=dict(zip(keys,values))
>>> d
{'blue': 500, 'white': 300, 'red': 100}
zip函数提供了另一种方法来交换键值对,但在只有值是不可改变的情况下,才能作为键交换。下面的会话交换了前面会话中的键值对:
>>> d
{'blue': 500, 'white': 300, 'red': 100}
>>> d2=dict(zip(d.values(),d.keys()))
>>> d2
{300: 'white', 500: 'blue', 100: 'red'}
参考文献:
1、《Python入门经典》
2、Python字典