Fork me on GitHub

每天5分钟玩转Python(07) - 基本数据类型(下)

继续上一篇的数据结构讲解,这篇讲解Set(集合)和Dictionary(字典)的使用方法。

Set(集合)

大家都知道数学中集合的定义为:将数个对象归类而分成为一个或数个形态各异的大小整体。 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。

Python中通过内置函数set()可获取到集合这种数据类型。参数可以是一个list

s = set([1, 2, 3])

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

s.add(4)

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

s.remove(4)

既然是集合,那么就应该支持数学上的集合运算。两个set可以做数学意义上的交集、并集、差集、异或集等操作:

s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2 #集合的交集运算
s1 | s2 #集合的并集运算
s1 - s2 #集合的差集运算
s1 ^ s2 #集合的异或运算,也就是不同时存在的元素。(要么只在s1中有,要么只在s2中有)

有一点要注意的是,set里面是不能放入可变对象的。因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。 比如往set里面添加list就会报错,而添加str类型的就正常。

Dictionary(字典)

字典就是一个键值对的数据结构,这个在编程中非常常见。比如通过学号对应一个学生, 那么学号可以作为key,而学生信息作为value。

Python内置了字典的支持,初始化一个字典对象很简单。

d = {} #初始化一个空的字典
d = {'1001': '张三', '1002': '李四'} # 带初始值的字典

添加新的键值对也非常简单:

d['1003'] = '王五'

由于一个key只能对应一个value,所以,多次对一个key放入value, 后面的值会把前面的值冲掉,这时候就是相当于更新这个键值对了:

d['1003'] = '赵六'

如果访问字典的时候key不存在,dict就会报错:

print(d['9999'])

报错:

Traceback (most recent call last):
<class 'dict'>
  File "D:/projects/python/core-python/test.py", line 20, in <module>
    print(d['9999'])
KeyError: '9999'

要避免key不存在的错误,有两种办法。

第一种是在访问字典之前,先通过in判断key是否存在,如果存在再访问:

if '9999' in d:
    print(d['9999'])

第二种是调用dict提供的get()方法,传入一个默认值。如果key不存在则返回默认值

print(d.get('9999', 'default'))

要从字典中删除一个key,可以使用pop()方法,对应的key/value对也会从dict中删除:

print(d)
result = d.pop('1002')
print(d)

输出结果:

{'1001': '张三', '1002': '李四'}
{'1001': '张三'}

还有一点需要注意的是,dict内部存放的顺序和key放入的顺序是没有关系的。并且dict中的key跟集合一样必须是不可变对象。

可变和不可变对象

上面讲到集合和字典的时候都提到了可变对象、不可变对象。那么这两者到底有啥区别。 其实从字面含义上就已经很容易理解,不可变对象就是只对象一旦初始化后,其状态或内容都不允许发生改变了。 而不可变对象随时都可以改变状态和内容。

比如字符串str类型就是不可变对象,而列表list类型就是可变对象。

str1 = '123456'
str2 = str1.replace('1', '9')
print(str1)
print(str2)

list = ['1', '2']
print(list)
list.append('3')
print(list)

输出如下

123456
923456
['1', '2']
['1', '2', '3']

可以看到,变量str1指向的对象内容始终是123456。即使在上面进行了一次替换操作, 这次替换操作会返回一个新的str对象。而列表list对象在对它进行操作后,内容以及改变了。

对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。一般来讲这些方法会创建新的对象并返回, 这样,就保证了不可变对象本身永远是不可变的。

OK,关于Python基本数据类型介绍到这里。喝杯小酒歇会吧!