课时25:字典:当索引不好用时

目录:

  一 、字典(哈希、关系数组)

  二、创建和访问字典

  三、课时25课后习题及答案

*********************************

一 、字典(哈希、关系数组)

*********************************

在Python中也有字典,又称为哈希(hash),有些地方称为关系数组。

字典是Python中唯一的映射类型,映射是数学上的一个术语,指的是两个元素集合之间元素相互“对应”关系,如下图所示:

映射类型区别于序列类型,序列类型一数组的形式存储,通过索引的方式来获取相应位置的值,一般索引值与对应位置存储的数据是毫无关系的。举个例子:

>>> brand = ["李宁","耐克","阿迪达斯","鱼C工作室"]
>>> slogan = ["一切皆有可能","Just do it","Impossible is nothing","让编程改变世界"]
>>> print("鱼C工作号的口号是:",slogan[brand.index("鱼C工作室")])
鱼C工作号的口号是: 让编程改变世界

列表brand和slogan的索引和相对的值是没有任何关系的,可以看出,唯一有关系的就是两个列表之间,索引号相同的元素是有关系的(品牌对应口号嘛),所以这里通过“brand.index(“鱼C工作室”)”这样的语句,间接地实现通过品牌查找对应口号的功能。这种方式有点差强人意,所以,需要有字典这种映射类型的出现。

***********************

二、创建和访问字典

***********************

 先演示下用法:

>>> dict1 = {"李宁":"一切皆有可能","耐克":"Just do it","阿迪达斯":"Impossible is nothing","鱼C工作室":"让编程改变世界"}
>>> dict1
{'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing', '鱼C工作室': '让编程改变世界'}
>>> print("鱼C工作号的口号是:",dict1['鱼C工作室'])
鱼C工作号的口号是: 让编程改变世界

字典的使用非常简单,它有自己的标志性符号,就是用大括号( { } )定义。字典由多个键及其对应的值共同构成,每一对键值组合称为项。在刚才的例子中,“李宁”“耐克”“阿迪达斯“”鱼C工作室”这些品牌就是键,而”一切皆有可能”,”Just do it”,”Impossible is nothing”,”让编程改变世界”这些口号就是对应的值。也许细心的你发现了:字典中的项跟创建的顺序不一样的?没错,字典跟序列不同,序列讲究顺序,字典讲究映射,不讲顺序。

另外,需要注意的是:字典的键必须是独一无二的,而值可以取任何数据类型,但必须是不可变的(如字符串、数或元组)。

要申明一个空字典,直接用大括号即可:

>>> empty = {}
>>> empty
{}
>>> type(empty)
<class 'dict'>

你也可以用dict()来创建字典:

>>> dict1 = dict((('F',70),('i',105),('s',115),('h',104),('c',67)))
>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'c': 67}

为什么会有这么多的括号呢?

因为dict()函数的参数可以是一个序列(但不能是多个),所以要打包成一个元组序列(列表也可以)。当然,如果嫌上面的做法太麻烦,还可以通过提供具有映射关系的参数来创建字典:

>>> dict1 = dict(F=70,i=105,s=115,h=104,c=67)
>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'c': 67}

这里要注意的是键的位置不能加上字符串的引号,否则会报错:

>>> dict1 = dict('F'=70,'i'=105,'s'=115,'h'=104,'c'=67)
SyntaxError: keyword can't be an expression

还有一种创建的方法是直接给字典赋值,如果键存在,则改写键对应的值;如果不存在,则创建一个新的键并赋值:

>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'c': 67}
>>> dict1['x'] = 88
>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'c': 67, 'x': 88}
>>> dict1['x'] = 120
>>> dict1
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'c': 67, 'x': 120}

正所谓殊途同归,下面列举的五种方法都是创建同样的字典,我们好好的体会下:

>>> a = dict(one = 1,two = 2,three = 3)
>>> b = {'one':1,'two':2,'three':3}
>>> c = dict(zip(['one','two','three'],[1,2,3]))
>>> d = dict([('two',2),('one',1),('three',3)])
>>> e = dict({'three':3,'one':1,'two':2})
>>> a == b == c == d == e
True
>>> a
{'one': 1, 'two': 2, 'three': 3}
>>> b
{'one': 1, 'two': 2, 'three': 3}
>>> c
{'one': 1, 'two': 2, 'three': 3}
>>> d
{'two': 2, 'one': 1, 'three': 3}
>>> e
{'three': 3, 'one': 1, 'two': 2}

*******************************

三、课时25课后习题及答案

*******************************

发表回复