字典、bytes和set集合类型
1.字典类型
字典介绍
-
Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value) 的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。它是一种 可变对象 ,所以支持修改、插入、删除等操作。
-
字典的key必须是不可变的对象,例如整数、字符串、bytes和元组,但使用最多的还是字符串。 列表、字典、集合等就不可以作为key。同时,同一个字典内的key必须是唯一的,但值则不必。
-
简而言之,字典可精确描述为不定长、可变、无序、散列的集合类型
-
字典的每个键值对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。
例如:d = {key1 : value1, key2 : value2 }
创建字典
- 创建空字典
>>> dic = {}
>>> dic
{}
>>> type(dic)
<class 'dict'>
>>> dict()
{}
- 创建字典三种方式
>>> dic1 = {'name':'amy','age':'18'}
>>> type(dic1)
<class 'dict'>
>>> dic2 = dict(name="amy",age='18')
>>> type(dic2)
<class 'dict'>
>>> dic3 = dict([('name','amy'),('age','18')])
>>> type(dic3)
<class 'dict'>
>>> dic1 == dic2 == dic3 # ==比较数值
True
访问字典
- 字典是集合类型,不是序列类型,因此没有索引下标的概念,更没有切片的说法。但是,与list类似,字典采用把相应的键放入方括号内获取对应值的方式取值。
>>> dic1 = {'name':'amy','age':18}
>>> dic1['name']
'amy'
>>> dic1['gender'] # 当key值不存在时,则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'gender'
增加和修改
- 增加就是往字典插入新的键值对,修改就是给原有的键赋予新的值。由于一个key只能对应一个值,所以,多次对一个key赋值,后面的值会把前面的值覆盖掉。
>>> dic1 = {'name':'amy','age':18}
>>> dic1['gender'] = "female" # 增加key值为"gender",value值为"female"的元素
>>> dic1
{'name': 'amy', 'age': 18, 'gender': 'female'}
>>> dic1['gender'] = 'male' # 当有该key:value值时,取出来重新赋值则进行了修改
>>> dic1
{'name': 'amy', 'age': 18, 'gender': 'male'}
删除字典元素、清空字典和删除字典
- 使用del关键字删除字典元素或者字典本身,使用字典的clear()方法清空字典
>>> dic1
{'name': 'amy', 'age': 18, 'gender': 'male'}
>>> del dic1['name'] # 删除某key:value元素
>>> dic1
{'age': 18, 'gender': 'male'}
>>> dic1
{'age': 18, 'gender': 'male'}
>>> dic1.clear() # 清空字典
>>> dic1
{}
>>> del dic1 # 删除整个字典
>>> dic1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dic1' is not defined
字典的方法
- get(key) 返回指定键的值,如果值不在字典中,则返回default值
- items() 以列表返回可遍历的(键, 值) 元组对
- keys() 以列表返回字典所有的键
- values() 以列表返回字典所有的值
代码如下:
>>> dic1 = {'name':'amy','age':18}
>>> dic1.get('name')
'amy'
>>> dic1.get('gender') # 当key:value不存在时,返回None
>>> dic1.items()
dict_items([('name', 'amy'), ('age', 18)])
>>> for k,v in dic1.items():
... print(k,v)
...
name amy
age 18
>>> dic1.keys()
dict_keys(['name', 'age'])
>>> dic1.values()
dict_values(['amy', 18])
2.字节(bytes)类型
bytes介绍
-
在Python3以后,字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的。
-
bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样,也是不可变的序列对象。
-
Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等。
bytes创建
- 可以通过调用bytes()生成bytes实例,其值形式为 b’xxxxx’,对于同一个字符串如果采用不同的编码方式生成bytes对象,就会形成不同的值。
>>> a = b'hello'
>>> type(a)
<class 'bytes'>
>>> b = bytes('hello',encoding='utf8')
>>> type(b)
<class 'bytes'>
bytes类型常用转换
- 在实际应用中,我们通常会将bytes类型与str类型做转换。
- 字节转为字符串
>>> d = b'world'
>>> d.decode()
'world'
>>> type(d)
<class 'bytes'>
- 字符串转为字节
>>> e = 'world'
>>> e.encode()
b'world'
>>> type(e)
<class 'str'>
3.集合(set)类型
- 集合(set)
集合介绍
-
set集合是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素。 是可变数据类型。
-
集合数据类型的核心在于自动去重。
创建集合
- 集合使用大括号 { } 框定元素,并以逗号进行分隔。
- 注意:如果要创建一个空集合,必须用 set() 而不是 {} ,因为后者创建的是一个空字典。
>>> s = {1,2,3}
>>> s
{1, 2, 3}
>>> type(s)
<class 'set'>
>>> s = {} # 注意,空的{}会默认为字典
>>> type(s)
<class 'dict'>
集合还可以使用set()函数来创建。
使用方法如下:
- set() -> new empty set object(创建空集合)
>>> s = set() # 创建空集合
>>> s
set()
>>> type(s)
<class 'set'>
- set(iterable) -> new set object(创建集合)
>>> s = set([1,2,3,1,2,3,4]) # 创建集合,去重
>>> s
{1, 2, 3, 4}
>>> s1 = set("hello world") # 创建集合,去重
>>> s1
{'h', 'd', 'o', ' ', 'e', 'l', 'r', 'w'}
>>> s2 = set(123) # 注意,需要传入可迭代的对象,而int类型的123并不是,所以报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
集合添加元素
- 通过set.add(key)方法可以添加元素到set中,可以重复添加,但没有效果:
>>> s = set([1,2,3,1,2,3,4])
>>> s
{1, 2, 3, 4}
>>> s.add(3) # 重复添加,自动去重
>>> s
{1, 2, 3, 4}
>>> s.add(6) # 添加成功
>>> s
{1, 2, 3, 4, 6}
>>> s.add("tly") # 添加成功
>>> s
{1, 2, 3, 4, 6, 'tly'}
>>> s.add([1,2,3]) # 报错,同字典一样 不能添加可变对象
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
集合更新
- 可以通过set.update() 方法,将另一个对象更新到已有的集合中,这一过程同样会进行去重。
>>> s = set([1,2,3,4,5])
>>> s.update("hello") # 将hello拆开放入集合
>>> s
{1, 2, 3, 4, 5, 'h', 'o', 'e', 'l'}
>>> s.update("hello") # 仍然去重
>>> s
{1, 2, 3, 4, 5, 'h', 'o', 'e', 'l'}
删除元素
- 通过remove(key)方法删除指定元素,或者使用pop()方法。注意,集合的pop方法无法设置参数,删除指定的元素:
- set.remove()
>>> s = {1, 2, 3, 4, 5, 'h', 'o', 'e', 'l'}
>>> s.remove(1) # 删除该元素
>>> s
{2, 3, 4, 5, 'h', 'o', 'e', 'l'}
>>> s.remove('h') # 删除该元素
>>> s
{2, 3, 4, 5, 'o', 'e', 'l'}
>>> s.remove('www') # 删除不存在的元素则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'www'
- set.pop()
>>> s1 = set("hello world")
>>> s1.pop() # 注意是随机删除
'w' #{'d', 'r', 'l', ' ', 'e', 'o', 'h'}
>>> s1.pop(1) # 不能通过索引删除,因为本身无序
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no arguments (1 given)
- 需要注意的是,集合不能取出某个元素,因为集合既不支持下标索引也不支持字典那样的通过键值对获取。
>>> s1
{' ', 'e', 'l', 'r', 'w'}
>>> s1[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
- 集合数据类型属于Python内置的数据类型。集合是一种非常有用的数据结构,它的去重和集合运算是其它内置类型都不具备的功能,在很多场合有着非常重要的作用,比如网络爬虫。