Python:字典(dict)

一:作用

二:定义

三:类型转换

四:内置方法

 

一:字典类型的作用

按照索引位置存放一组数据用于存取,数据为键值对对应关系

字典无序并且key不可重复

 

二:字典类型的定义

{}内用多个逗号分隔开key:value,其中value可以为任意类型,但key必须为不可变类型,否则会直接类型错误

mmm = {22:78,'李老八':66,(9,):80}
print(mmm)
lll = {[1,2,3]:2,222:333}

以上代码执行结果为:

Traceback (most recent call last):
File "D:\PyCharm\lizi\basis\20200302\字典.py", line 6, in <module>
lll = {[1,2,3]:2,222:333}
TypeError: unhashable type: 'list'
{22: 78, '李老八': 66, (9,): 80}

有执行结果可以看出,使用字符串整型元组类型定义key都不会报错,使用list定义key直接报错

如何定义一个空字典:

lll = {}
print(type(lll))

以上代码执行结果为:

<class 'dict'>

需要注意的是,集合的定义也是用{},如果你使用上边这种方法来定义集合,那它默认只能是个字典

所以可以这样定义空字典或集合:

lll = dict()
mm = set()
print(type(lll),type(mm))

以上代码执行结果为:

<class 'dict'> <class 'set'>

 

三:字典类型转换

info =[
    ['张三',26],
    ['李四',22],
    ['王二麻子',29]
]
lll = dict()
for i in info:
    lll[i[0]] = i[1]
print(lll)

以上代码执行结果为:

{'张三': 26, '李四': 22, '王二麻子': 29}

由执行结果可以看出,定义一个info列表,定义一个lll空字典,使用for循环遍历info并将值存入了lll,但这样太麻烦了

代码是否可以简单一点呢?

info = [
    ['张三',26],
    ['李四',22],
    ['王二麻子',29]
]
lll = dict()
for x,y in info:
    lll[x] = y
print(lll)

以上代码执行结果为:

{'张三': 26, '李四': 22, '王二麻子': 29}

由执行结果可已看出,在for循环传入两个值对应列表的子列表的两个值,并存入空字典lll,但还是很麻烦

再简单一点:

info = [
    ['张三',26],
    ['李四',22],
    ['王二麻子',29]
]
lll = dict(info)
print(lll)

以上代码执行结果为:

{'张三': 26, '李四': 22, '王二麻子': 29}

这回终于简单了。

好,那我现在有个需求,我有一个列表,我想把列表里的每个值当成key存入空字典,并给每个key赋予一个相同的默认值,怎么做?

lll = [1,2,3,4,5]
mmm = dict()
for i in lll:
    mmm[i] = None
print(mmm)

以上代码执行结果为:

{1: None, 2: None, 3: None, 4: None, 5: None}

这样看for循环还真是万能,就是太麻烦了,换个内置方法吧

lll = [1,2,3,4,5]
mmm = {}.fromkeys(lll,None)
print(mmm)

以上代码执行结果为:

{1: None, 2: None, 3: None, 4: None, 5: None}

使用{}.fromkeys方法可以很方便的解决字典初始值的问题

 

四:字典类型内置方法

字典的取值:

lll = {'张三':22,'李四':25,'王二麻子':29}
print(lll['张三'])

以上代码执行结果为:

22

由执行结果可知,字典取key得出的返回值是value,如果取value会直接报错

字典的赋值:

lll = {'张三':22,'李四':25,'王二麻子':29}
lll['张三'] = 33
print(lll)

以上代码执行结果为:

{'张三': 33, '李四': 25, '王二麻子': 29}

由执行结果可知,字典的赋值也是根据key来进行操作,需要注意的是,在list里如果对一个不存在的值进行修改会报错,那么在字典里呢?

lll = {'张三':22,'李四':25,'王二麻子':29}
lll['王五'] = 99
print(lll)
print('---------此为分割线----------')
mmm = ['张三','李四','王二麻子']
mmm[3] = '王五'
print(mmm)

以上代码执行结果为:

{'张三': 22, '李四': 25, '王二麻子': 29, '王五': 99}
---------此为分割线----------
Traceback (most recent call last):
  File "D:\PyCharm\lizi\basis\20200302\字典.py", line 53, in <module>
    mmm[3] = '王五'
IndexError: list assignment index out of range

由执行结果可知,字典里对于一个没有的key的修改操作默认为插入,同时,由于字典是无序的,所以字典也就不存在索引操作

字典的长度:

lll = {'张三':22,'李四':25,'王二麻子':29}
mmm = {'张三':22,'李四':25}
print(len(lll))
print(len(mmm))

以上代码执行结果为:

3
2

由执行结果可知,len方法统计的是字典的key的个数,当然你也可以说统计的是value的个数

字典的成员运算:

lll = {'张三':22,'李四':25,'王二麻子':29}
print('李四' in lll)
print('张三' not in lll)

以上代码执行结果为:

True
False

由执行结果可知,in和not in比较的是值与字典里的key是否对应

字典的删除:

lll = {'张三':22,'李四':25,'王二麻子':29}
des = lll.pop('张三')
aaaa = lll.pop('王二麻子')
print(des)
print(aaaa)

以上代码执行结果为:

22
29

由执行结果可知,pop方法删除的返回值是字典里的value

字典的删除还有另外一种方法:

lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88}
des = lll.popitem()
aaaa = lll.popitem()
ssss = lll.popitem()

print(lll)
print(des)
print(aaaa)
print(ssss)

以上代码执行结果为:

{'张三': 22}
('李老八', 88)
('赵老四', 77)
('王二麻子', 29)
('李四', 25)

.popitem()方法在python3.7以前是随机删除一个key,3.7以后改为删除最后一个加入字典中的key

现在有一个需求,我只想要字典的key或字典的value怎么办?

lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88}
print(lll.keys())
print(lll.values())
print(lll.items())

以上代码执行结果为:

dict_keys(['张三', '李四', '王二麻子', '赵老四', '李老八'])
dict_values([22, 25, 29, 77, 88])
dict_items([('张三', 22), ('李四', 25), ('王二麻子', 29), ('赵老四', 77), ('李老八', 88)])

完成!

字典的其他方法:

lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88}
lll.clear()
print(lll)

以上代码执行结果为:

{}

由执行结果可知,字典的clear方法同列表和元组一样都是删除

lll = {'张三':22,'李四':25,'王二麻子':29,'赵老四':77,'李老八':88}
print(lll.get('雪人'))
print('---------此为分割线---------')
print(lll['雪人'])

以上代码执行结果为:

None
---------此为分割线---------
Traceback (most recent call last):
  File "D:\PyCharm\lizi\basis\20200302\字典.py", line 92, in <module>
    print(lll['雪人'])
KeyError: '雪人'

由执行结果可知,当你按key取value时,如果key不存在,正常来说会报错。

当你使用get方法后,如果这个key不存在那么会返回一个None从而使你的程序不会崩溃

get方法在很多情况下都有用。

lll = {'张三':22}
print(lll)
lll.update({'张三':99,'王二麻子':29,'赵老四':77,'李老八':88})
print(lll)

以上代码执行结果为:

{'张三': 22}
{'张三': 99, '王二麻子': 29, '赵老四': 77, '李老八': 88}

由执行结果可知,update方法时更新字典,更新后字典的值以更新的值为准

 

我现在有一个需求,我想知道一个字典里有没有某个key,如果有则不需要做什么,如果没有那么将我准备的key和value加进去,怎么做?

这种情况很常见,比如判断是否有某个用户名,有的话不需要创建,没有的话要创建

先用if in来处理:

lll = {'姓名':'李老八','年龄':27}
aa = '性别'
# print(lll)
if aa in lll:
    print('不需要')
    ...
else:
    lll[aa] = ''
    print(lll)

以上代码执行结果为:

{'姓名': '李老八', '年龄': 27, '性别': ''}

嗯,要的就是这种效果

python提供了一种方法处理这种问题

lll = {'姓名':'李老八','年龄':27}
aa = '性别'
lll.setdefault(aa,'')
print(lll)

以上代码执行结果为:

{'姓名': '李老八', '年龄': 27, '性别': ''}

.setdefault方法默认需要传入key和value,如果你只给了一个key,那么value的值默认为None

.setdefault方法的作用同上方 if in效果一样,在某些场景下比较有用,根据个人来判断用哪种方法吧

 

posted @ 2021-03-02 17:09  Sqlserverwooooo  阅读(341)  评论(0编辑  收藏  举报