一、字典:当索引不好用时
- 字典基本知识:
列表的缺点:
-
列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢。
-
列表只能按照顺序存储,数据与数据之间关联性不强。
所以针对于上的缺点,说咱们需要引入另一种容器型的数据类型,解决上面的问题,这就需要dict字典。
数据类型按照可变与不可变的数据类型的分类:
不可变(可哈希)的数据类型:int,str,bool,tuple。
可变(不可哈希)的数据类型:list,dict,set。
字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的:
Key: 不可变(可哈希)的数据类型.并且键是唯一的,不重复的。
Value:任意数据(int,str,bool,tuple,list,dict,set),包括后面要学的实例对象等。
在Python3.5版本(包括此版本)之前,字典是无序的。
在Python3.6版本之后,字典会按照初建字典时的顺序排列(即第一次插入数据的顺序排序)。
当然,字典也有缺点:他的缺点就是内存消耗巨大。
- 创建和访问字典
1.要声明一个字典,直接使用大括号{}即可
2.也可以使用dict()来创建字典,参数可以是一个序列(但不能是多个),所以要打包成一个元祖序列(列表也可以)
3.如果嫌麻烦,还可以通过提供具有映射关系的参数来创建字典(注意:键的位置不能加上引号)
>>> empty = {}
>>> empty
{}
>>> type(empty)
<class 'dict'>
>>> 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
各种内置方法
- fromkeys() 该方法用于创建并返回一个新的字典,它有两个参数:第一个是字典的键;第二个参数是可选的,是传入键对应的值。如果不提供,那么默认是None。
>>> dict1 = {}
>>> dict1.fromkeys((1, 2, 3))
{1: None, 2: None, 3: None}
>>> dict2 = {}
>>> dict2.fromkeys([1, 2, 3],"Number")
{1: 'Number', 2: 'Number', 3: 'Number'}
>>> dict3 = {}
# #fromkeys( )把("one", "two", "three")当成一个参数了
>>> dict3.fromkeys((1, 2, 3), ("one", "two", "three"))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
- keys()方法 返回字典中的键
- value()方法 用于返回字典中所有的值
- items()方法 返回字典中所有的键值对(项)
>>> dict1 = {}
>>> dict1 = dict1.fromkeys(range(10), "good")
>>> dict1.keys()
dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> dict1.values()
dict_values(['good', 'good', 'good', 'good', 'good', 'good', 'good', 'good', 'good', 'good'])
>>> dict1.items()
dict_items([(0, 'good'), (1, 'good'), (2, 'good'), (3, 'good'), (4, 'good'), (5, 'good'), (6, 'good'), (7, 'good'), (8, 'good'), (9, 'good')])
#返回值是一个字典对应的对象
>>> type(dict1.keys())
<class 'dict_keys'>
>>> type(dict1.values())
<class 'dict_values'>
>>> type(dict1.items())
<class 'dict_items'>
- 直接给字典的键赋值,如果键存在,那么改写键对应的值;如果不存在,则创建一个新的键并赋值。只给键可用于查询对应的键值,没有该键时报错。
- get()方法 提供了更宽松的方式去访问字典项,当键不存在的时候,get()方法并不会报错,只是默默地返回一个None,表示啥也没找到。当然也可以自定义无此键时的返回值
- setdefault ()方法可用于增加键值对和查询键对应的值,有返回值
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1['weight'] = 60 # 没有这个键则添加
>>> dict1
{'name': 'jacky', 'age': '18', 'weight': 60}
>>> dict1['name'] = 'kugua' # 有则覆盖,赋予新的键值
>>> dict1
{'name': 'kugua', 'age': '18', 'weight': 60}
>>> dict1['name'] #返回键对应的值
'kugua'
>>> dict1['sex'] #没有此键就会报错
...
KeyError: 'sex'
>>> dict1.get("sex")
>>> print(dict1.get("sex")) #找不到时默认返回None
None
>>> dict1.get("sex","木有") #指定无此键时的返回值
'木有'
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1.setdefault('height', 171) # 没有这个键则添加
171
>>> dict1
{'name': 'jacky', 'age': '18', 'height': 171}
>>> dict1.setdefault('name', 'kugua') # 有此键则不变
'jacky'
>>> dict1
{'name': 'jacky', 'age': '18', 'height': 171}
>>> dict1.setdefault('sex') #只给定一个参数,则默认赋键值为None
>>> dict1
{'name': 'jacky', 'age': '18', 'height': 171, 'sex': None}
- update()方法可以用来更新字典(添加、更新、组合)
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1.update(sex='男',height='171') #键不用引号,添加和更新新的键值对
>>> dict1
{'name': 'jacky', 'age': '18', 'sex': '男', 'height': '171'}
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1.update([(1,'a'),(2,'b')]) #传入有映射关系的一个序列更新字典
>>> dict1
{'name': 'jacky', 'age': '18', 1: 'a', 2: 'b'}
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict2 = {'sex':'男','height':171}
>>> dict1.update(dict2) #将dict2组合到dict1中
>>> dict1
{'name': 'jacky', 'age': '18', 'sex': '男', 'height': 171}
- pop() 是给定键弹出对应的值,有返回值,可设置返回值
- popitem() 是弹出一个项,3.5版本之前,popitem为随机删除,3.6之后为删除最后一个,有返回值
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1
{'name': 'jacky', 'age': '18'}
>>> dict1.pop('name')
'jacky'
>>> dict1
{'age': '18'}
>>> ret1 = dict1.pop('weight','木有') #指定没有改键时的返回值
>>> print(ret1, dict1)
木有 {'age': '18'}
>>> dict1 = {'name':'jacky','age':'18'}
>>> dict1.popitem() #弹出最后一项
('age', '18')
>>> dict1
{'name': 'jacky'}
- clear() 方法用于清空字典
- del 语句通过键删除键值对(无此键会报错),还可用于删除整个字典
>>> dict1 = {'name':'jacky','age':'18'}
>>> del dict1['name'] #给定键值删除项
>>> dict1
{'age': '18'}
>>> dict1.clear()
>>> dict1
{}
>>> del dict1
>>> dict1
二、集合:你就是唯一
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。
以下是集合最重要的两点:
- 去重,把一个列表变成集合,就自动去重了。
- 关系测试,测试两组数据之前的交集、差集、并集等关系。
- 集合的创建:直接{} 或者set()方法
>>> set1 = {'jacky', 'haha'}
>>> set2 = set(['jacky','haha'])
>>> set1 == set2
True
- 集合的访问:in ,not in
- add(方法添加元素,update()方法更新元素
- remove()方法删除集合已知元素
- pop()随机删除一个元素
- clear()清空 del删除
>>> set1 = {'jacky',171,'boy'}
>>> set1.add('IT') #添加元素
>>> set1
{'IT', 'jacky', 171, 'boy'}
>>> set1.update('ABC') #迭代增加,也可以传入列表、元祖等
>>> set1
{'C', 'IT', 'jacky', 'B', 171, 'A', 'boy'}
>>> set1.remove('jacky') #删除元素
>>> set1
{'C', 'IT', 'B', 171, 'A', 'boy'}
>>> set1.pop() #随机弹出一个元素
'C'
>>> set1.clear() #清空集合
>>> set1
set()
>>> set1.cler #删除该集合
>>> del set1
- 定义一个不可变集合可以使用frozenset()函数。
>>> set1 = frozenset({1, 2, 3, 4, 5})
>>> type(set1)
<class 'frozenset'>
>>> set1.add(7) #尝试修改集合内容会报错
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
set1.add(7)
AttributeError: 'frozenset' object has no attribute 'add'
- 集合的其他操作