当前位置: 首页> 技术文章> Python数据结构之字典

Python数据结构之字典

字典是Python中非常重要的数据结构,这篇笔记用十个例子带你回顾字典创建和使用的常用方法,基本能覆盖字典的大部分使用场景。


首先,回顾下字典是啥来着?

字典的主要用途是存放具有映射关系的数据。比如我们我们有一份成绩表数据,John:A, Emily: A+, Betty:B, Mike: C, Ashley: A。左边是学生的姓名,右边的学生的成绩。我们当然可以用两个列表来储存这两组数据,但是两个列表的元素之间有一定的关联关系。两个列表是无法记录两组数据之间的关联关系。

upfile1611308656962.png


为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value


键必须是唯一且不可变的。所以我们可以使用字符串、数字(int或float)或元组作为键。值可以是任何类型的。由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。


创建字典时可以和列表解析式类似地通过迭代的方法来创建字典,语法上稍微有点不同,逻辑非常相似,先看第一个例子。


例1

分别用列表解析式和字典解析式创建一个列表和字典,看下写法有什么区别。

words = ['data', 'science', 'machine', 'learning']
#list comprehension
[len(i) for i in words]
[4, 7, 7, 8]
#dictionary comprehension
{i:len(i) for i in words}
{'data': 4, 'science': 7, 'machine': 7, 'learning': 8}


在这里我们用到例迭代器,它是一个名为 "words"的列表。在列表解析式中,我们创建一个包含单词长度的列表。在字典解析式中,我们需要根据迭代来指定键和值。返回的字典中包含单词作为键和它们的长度作为值。

列表和字典解析式的基本语法是:


List = [expression for item in iterable (if conditional)]
Dictionary = {expression for key, value in iterable (if conditional)}

例2

在第一个例子基础上,我们在解析式中增加if/else条件。

比如我们想返回只包含超过5个字符的单词:


words = ['data', 'science', 'machine', 'learning']
#list comprehension
[len(i) for i in words if len(i) > 5]
[7, 7, 8]
#dictionary comprehension
{i:len(i) for i in words if len(i) > 5}
{'science': 7, 'machine': 7, 'learning': 8}

例3


如果我们if/else条件比较复杂,比如我们想增加一个else:


words_dict = {i:len(i) if len(i) > 5 else 'short' for i in words}

print(words_dict)

{'data': 'short', 'science': 7, 'machine': 7, 'learning': 8}

这里我们在字典解析式中实现了一个if/else条件:如果长度大于5,则该值成为长度。否则,我们就将赋值 "短short"。

如果我们用for循环就会变成这样:

upfile1611308967458.png

解析式好用的地方这就体现出来了!

例4

如果我们想在字典解析式中同时迭代两个迭代词。可以使用zip函数,zip函数通过组合每个列表中的项目返回一个元组的迭代。这样键值对可以通过迭代键和值的独立列表来创建的

words = ['data', 'science', 'machine', 'learning'] 

values = [5, 3, 1, 8]

dict_a = {i:j for i, j in zip(words, values)}

print(dict_a) 

{'data': 5, 'science': 3, 'machine': 1, 'learning': 8}

例5


我们也可以在迭代一个元组列表时,对值设置一个条件。

words = ['data', 'science', 'machine', 'learning'] 

values = [5, 3, 1, 8]

dict_a = {i:j for i, j in zip(words, values) if j > 4}

print(dict_a) 

{'data': 5, 'learning': 8}

例6

我们还可以在键值对上使用Python里的方法进行修改,比如我们想所有Key都是大写:

dict_b = {i.upper():j**2 for i, j in zip(words, values)}

print(dict_b) 

{'DATA': 25, 'SCIENCE': 9, 'MACHINE': 1, 'LEARNING': 64}

例7

我们可以通过使用 items 方法访问字典中的键值对。


print(dict_b.items())

 dict_items([('DATA', 25), ('SCIENCE', 9), ('MACHINE', 1), ('LEARNING', 64)])

我们可以在字典解析式中使用现有字典的items作为迭代。它允许我们在现有字典的基础上创建字典,并修改键和值。


dict_c = {i.lower():j%2 for i, j in dict_b.items()}

print(dict_c) 

{'data': 1, 'science': 1, 'machine': 1, 'learning': 0}

例8

Python 的枚举函数可以用来创建一个基于列表的元组迭代。每个元组都包含列表中的项目,并以整数值递增。


names = ['John', 'Jane', 'Adam', 'Eva', 'Ashley']

list(enumerate(names)) 

[(0, 'John'), (1, 'Jane'), (2, 'Adam'), (3, 'Eva'), (4, 'Ashley')]

我们可以在字典解析式中使用枚举函数。

dict_names = {i:len(j) for i, j in enumerate(names)}

print(dict_names) 

{0: 4, 1: 4, 2: 4, 3: 3, 4: 6}

如果你只是想在不修改值的情况下,基于一个元组列表创建一个字典,也可以只使用dict函数。

dict(enumerate(names)) 

{0: 'John', 1: 'Jane', 2: 'Adam', 3: 'Eva', 4: 'Ashley'}

例9


这个例子包含的条件比前面的稍微复杂一些。


lst = ['data','science','artificial', 'intelligence']

dct = {'data': 5, 'science': 3, 'machine': 1, 'learning': 8}

假设我们要使用上面定义的 list 和 dictionary 创建一个新的字典,这个逻辑稍微有点复杂。新字典的键需要是 list 中的元素,如果这个元素也在原来的字典中,值将是该键在字典中的值。否则,这个元素的长度作为新字典的值。

在这里我们需要对 list 中的元素进行迭代:

{i:dct[i] if i in dct else len(i) for i in lst}

{'artificial': 10, 'data': 5, 'intelligence': 12, 'science': 3}

'artificial'不在原来字典中,所以它的值是该词的长度。'data'在原来的字典中,所以值取自字典。

例10

字典的键必须是不可变的,元组可以作为键使用。我们用字典解析式实现用元组作为字典的键。

a = [1,2,3] 

b = [5,6]

dct = {(i,j):i*j for i in a for j in b}

print(dct) 

{(1, 5): 5, (1, 6): 6, (1, 7): 7, (2, 5): 10, (2, 6): 12, (2, 7): 14, (3, 5): 15, (3, 6): 18, (3, 7): 21, (4, 5): 20, (4, 6): 24, (4, 7): 28}


元组中的每一对项目都是字典中的一个键。值是键中项目的乘积。

相当于for循环语法:

upfile1611309400480.png

总结


字典是Python中非常重要的数据结构,在很多情况下都会用到。我们在这篇文章中做的例子将涵盖你需要了解的关于字典理解的大部分内容。希望看完能有收获。


上一篇: 常用的 adb 命令合集

下一篇: 软件测试之手工测试人员如何转测试开发?

QQ技术交流群

多测师官方学习交流
556733550

加入群聊