Python字典和集合

一、字典:当索引不好用时

  • 字典基本知识:

列表的缺点:

  1. 列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢。

  2. 列表只能按照顺序存储,数据与数据之间关联性不强。

所以针对于上的缺点,说咱们需要引入另一种容器型的数据类型,解决上面的问题,这就需要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'
  • 集合的其他操作
    集合不常用的一些方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值