Python字典(Dictionary)和集合(set)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgcr654321/article/details/82663073

字典(Dictionary):

字典(Dictionary)可存储任意类型对象,如字符串、数字、元组等其他容器模型。

字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。

如:

假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['A', 'B', 'C']
scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用字典(Dictionary)实现,如下:

>>> d = {'A': 95, 'B': 75, 'C': 85}
>>> d['A']
95

我们可以直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。字典(Dictionary)根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

我们可以通过key来把数据放入字典。

一个key只能对应一个value,同一个key放入多个value值后放入的会把前面放入的value值覆盖。

如:

>>> d['D'] = 67
>>> d['D']
67

运行截图如下:

如果key不存在,字典(Dictionary)就会报错:

>>> d['E']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'E'

避免key不存在而产生错误的两种方法:

一是通过in判断key是否存在:

>>> 'E' in d
False

二是通过字典(Dictionary)提供的get()函数,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('E')
>>> d.get('E', -1)
-1

注意在Python的交互环境中,返回None的时候不显示结果。

运行截图如下:

删除key采用pop(key)方法,对应的value也会被删除:

>>> d.pop('B')
75
>>> d
{'A': 95, 'B':75, 'C': 85}

注意:

dict内部存放的顺序和key放入的顺序无关。

字典(Dictionary)与列表(list)的区别:

字典(Dictionary)的特点:

查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。

列表(list)的特点:

查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。

dict是用空间来换取时间的一种方法。

正确使用字典(Dictionary)要牢记的第一条就是dict的key必须是不可变对象。

字典(Dictionary)根据key来计算value的存储位置,这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

集合(set):

set可以看成数学意义上的无序和无重复元素的集合。set同样不可以放入可变对象。

可以使用大括号 { } 或者 set() 函数创建集合。

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

集合(set)用来存储一组key,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

创建格式:

parame = {value01,value02,...}

或者

set(value)

我们还可以通过提供一个list作为输入集合创建一个set

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

注意:

传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序不表示set有序。

重复元素在set中会自动被过滤。

如:

>>> T = set([1, 1, 2, 2, 3, 3])
>>> T
{1, 2, 3}

运行截图如下:

我们可以通过add(key)方法可以添加元素到set中,可以添加重复的key,但不会有效果。

如:

>>> T.add(4)
>>> T
{1, 2, 3, 4}
>>> T.add(4)
>>> T
{1, 2, 3, 4}

运行截图如下:

通过remove(key)方法可以删除元素。

>>> s.remove(3)
>>> s
{1, 2, 2}

两个set可以做数学意义上的交集、并集等操作。

如:

>>> s & T
{1, 2}
>>> s | T
{1, 2, 3, 4}

运行截图如下:

注意:

set不可放入list对象,也不可放入含list元素的元组(tuple)对象。

可变对象与不可变对象的区别:

str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的。

如:

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

对于不可变对象,比如str,对str进行操作,对象的内容不变化。

举例说明:

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

要理解上面的现象,我们先把代码改成下面这样:

>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'

注意:

'abc'才是字符串对象!我们所说的对象a的内容是'abc'其实是指,a本身是一个变量,它指向的对象的内容是'abc'。

当我们调用a.replace('a', 'A')时,实际上调用方法replace是作用在字符串对象'abc'上的,而这个方法虽然名字叫replace,但却没有改变字符串'abc'的内容。相反,replace方法创建了一个新字符串'Abc'并返回,如果我们用变量b指向该新字符串,变量a仍指向原有的字符串'abc',但变量b却指向新字符串'Abc'。

┌───┐                  ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘                  └───────┘
┌───┐                  ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘                  └───────┘

对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。这些方法会创建新的对象并返回。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82663073