来源:python中国网 时间:2019-06-06

  背景:

  怎样存储一个网站所有用户昵称?我们使用了列表。但是注册网站时每个用户除了昵称还有年龄等信息。单纯的列表存储似乎不大方便?谁来解决?-字典

  person={'name':'马云','money':很多','sex':'man','address':'杭州'}

  说明:

  字典和列表一样,也能够存储多个数据

  列表中找某个元素时,是根据下标进行的

  字典中找某个元素时,是根据'名字'(就是冒号:前面的那个值,例如上面代码中的'name'、'id'、'sex')

  字典的每个元素由2部分组成,键:值。例如'name':'马云','name'为键,'马云'为值

  一:字典创建:

  1.使用{}创建字典

  2.使用dict函数创建字典

  3.使用fromkeys方法创建字典
 

# ‐*‐ coding: utf‐8 ‐*‐

print('以下是使用{}创建字典')
# 创建空字典
d1 = {}
# 创建有元素的字典
d2 = {'a': 1, 'b': 2}
# python的键必需是不可变类型,值可以是任意的类型
d3 = {1: "seo", "name": "马云", (1, 8): 3.1415926, 'liebiao': [1, 2, 4, 3], True: {"help": 30}}
print(d1)
print(d2)
print(d3)

print('以下是使用dict函数创建字典')
# 创建空字典
d1 = dict()
# 创建有元素的字典
d2 = dict([(1, 'a'), (2, 'b'), (3, 'c')])
"""
注意:
1 使用dict创建字典的时候,参数(函数的参数这个概念后面会说)必需是可迭代类型(即可以for循环遍历,此处不理解没关系),
  参数的元素必须是成对出现的,元素的第一个值作为字典的键,第二个值作为字典的值。
2 这种类型的参数可以直接通过zip或者是map函数来快速创建
"""

# 下面的这几种形式都是支持的
# 1. 两个元素组成的二维列表: [['a', 1], ['b', 2]]
# 2. 包含双值元组的列表: [('a', 'b'), ('c', 'd')]
# 3. 包含双值列表的元组: (['a', 1], ['b', 2], ['c', 3], ['d', 4])
# 4. 包含双值元组的元组: (('a', 'b'), ('c', 'd'), ('e', 'f'))
# 5. 双字符字符串组成的列表: ['ab', 'cd', 'ef']
# 6. 双字符字符串组成的元组: ('ab', 'cd')
# 7. 上面的可以互相嵌套: [['a', 1], ('b', '2'), 'c3',(('nb',), ['d', 5])]
d3 = dict([['a', 1], ('b', '2'), 'c3',(('nb',), ['d', 5])])
print(d1)
print(d2)
print(d3)

print('以下是fromkeys创建字典')
# fromkeys(keys,[value]) 第一个参数是可迭代类型,类型的元素必须是不可变的, 第二个值是默认值,默认是None
# 1.使用dict.fromkkeys()创建字典,字典的键分别是a,b,c值都是None
d1 = dict.fromkeys('abc')
# 字典的键分别是1, 2, 3, 4值都是马老板
d2 = dict.fromkeys([1,2,3,4], '马老板')
# 2. 使用{}.fromkeys()创建字典
d3 = {}.fromkeys('abc')
# 3. 如果{}不是空的,那么使用fromkeys创建时会覆原来的内容
d4 = {'a': 2}.fromkeys(["name", "age", "class", "addr"], "大哥")
print(d1)
print(d2)
print(d3)
print(d4)

D:installpython3python.exe D:/pyscript/test/1.py
以下是使用{}创建字典
{}
{'a': 1, 'b': 2}
{1: {'help': 30}, 'name': '马云', (1, 8): 3.1415926, 'liebiao': [1, 2, 4, 3]}
以下是使用dict函数创建字典
{}
{1: 'a', 2: 'b', 3: 'c'}
{'a': 1, 'b': '2', 'c': '3', ('nb',): ['d', 5]}
以下是fromkeys创建字典
{'a': None, 'b': None, 'c': None}
{1: '马老板', 2: '马老板', 3: '马老板', 4: '马老板'}
{'a': None, 'b': None, 'c': None}
{'name': '大哥', 'age': '大哥', 'class': '大哥', 'addr': '大哥'}

Process finished with exit code 0


  二:字典相关操作:

  1.访问值

# ‐*‐ coding: utf‐8 ‐*‐

print('以下通过键名直接访问:')
#字典中的值都是以下通过键名来直接访问:的
d1 = {'name': '马云', 'age': 55}
print(d1['name'])

print('以下通过get方法访问:')
# 使用内键方法get来访问:,get方法接收两个参数,第一个是键名,第二个是默认值
# 默认值的意思就是说,假如键名不存在,就返回默认值, 默认是None
print(d1.get('name'))
print(d1.get('wife'))  # 不存在,返回默认值None
print(d1.get("wife", "wife-girl")) # 不存在,返回自定义的默认值girl

print('以下通过setdefault方法访问:')
# 使用字典内建方法setdefault来访问:字典中的键,该方法接收两个参数,第一个是键名,第二个是默认值None。
# 如果键名存在,就返回键名对应的值,如果键名不存在,则在字典中创建一个键名,并把默认值设为对应的值。
print(d1.setdefault('name'))
print(d1.setdefault('son','马小云'))
print(d1['son'])

print('以下通过for循环访问:')
# 以下通过for循环来访问:字典中的元素,for循环默认迭代的是字典中的键(key)
for key in d1:
 print(d1[key])

print('以下通过items访问:')
# Python字典items()函数以列表返回可遍历的(键, 值) 元组数组
print(d1.items())
for key, val in d1.items():
   print(key, val)

D:installpython3python.exe D:/pyscript/test/1.py
以下通过键名直接访问:
马云
以下通过get方法访问:
马云
None
wife-girl
以下通过setdefault方法访问:
马云
马小云
马小云
以下通过for循环访问:
马云
55
马小云
以下通过items访问:
dict_items([('name', '马云'), ('age', 55), ('son', '马小云')])
name 马云
age 55
son 马小云

Process finished with exit code 0


  2.修改元素

  3.添加元素

  4.删除元素

  5.查询是否存在某个键

# ‐*‐ coding: utf‐8 ‐*‐
print('以下是修改元素')
d1 = {'name':'马云','nickname':'首富','age':55}
d1['age'] = 18
print(d1['age'])

print('以下是添加元素')
# 在使用 变量名['键'] = 数据 时,这个“键”在字典中,不存在,那么就会新增这个元素
d1 = {'name':'马云','nickname':'首富','age':55}
d1['name2'] = '马化腾'
print(d1)

# 将另一个字典中的元素添加进来
d2 = {1: 'a', 2: 'b'}
d1.update(d2) # 将dict2中的所有键值对添加到dict1中
print(d1)

print('以下是删除元素del clear应用')
# 删除指定键名的元素
d1 = {'name':'马云','nickname':'首富','age':55}
del d1['age'] # 把键名为age的元素删除
print(d1.pop('name')) # 把键名为name的元素删除并返回它的值

# 删除字典 d1不存在了
del d1
# 清空整个字典(删除字典里面的所有元素)
d2 = {'name':'马云','nickname':'首富','age':55}
d2.clear()
print(d2)

print('以下是查询字典中是否存在某个键')
# 使用成员操作符(in, not in)查询字典中是否存在某个键名
d1 = {'name':'马云','nickname':'首富','age':55}
if 'name' in d1:
    print('name在')
if 'id' not in d1:
    print('id不在')
D:installpython3python.exe D:/pyscript/test/1.py
以下是修改元素
18
以下是添加元素
{'name': '马云', 'nickname': '首富', 'age': 55, 'name2': '马化腾'}
{'name': '马云', 'nickname': '首富', 'age': 55, 'name2': '马化腾', 1: 'a', 2: 'b'}
以下是删除元素del clear应用
马云
{}
以下是查询字典中是否存在某个键
name在
id不在

Process finished with exit code 0


  三:字典常用函数:

  1.len()

  测量字典中,键值对的个数;也就是字典的长度

  2.keys

  返回一个包含字典所有key的列表

  3.values

  返回一个包含字典所有value的列表

  4.items

  返回一个包含所有(键,值)元祖的列表

# ‐*‐ coding: utf‐8 ‐*‐
d1 = {'name':'马云','nickname':'首富','age':55}
print('d1长度',len(d1))
print('d1的键',d1.keys())
print('d1的值',d1.values())
print(d1.items())

Process finished with exit code 0
D:installpython3python.exe D:/pyscript/test/1.py
d1长度 3
d1的键 dict_keys(['name', 'nickname', 'age'])
d1的值 dict_values(['马云', '首富', 55])
dict_items([('name', '马云'), ('nickname', '首富'), ('age', 55)])


  四:更多字典函数介绍:


函数 说明
clear 清空字典中的所有元素
copy 返回字典的一个浅拷贝
dict.fromkeys(seq,val=None) 创建并返回一个新的字典,以seq(序列类型)中的元素做该字典,val做该字典中所有键值对应的初始值(如果不提供此值,则默认为None)
dict.get(key, default=None) 返回字典中键key对应的值,如果字典中不存在此键,则返回default的值,default的值默认为None
dict.items() 返回一个包含字典中键值对组成的类集合对象dict_items,只能通过迭代的方式获取里面的元素
dict.keys() 返回字典中所有键组成的一个类集合对象,这个对象叫dict_keys
dict.pop(key) 从字典中删除键key及其对应的值,并返回其对应的值
dict.popitem() 删除字典中的某个键值对,并返回有键值对组成的双元素元组
dict.setdefault(key,default=None) 如果字典中存在key,则返回key对应的值,如果不存在则在字典中新建一个key,并以default的值设为它的值,default的值默认是None
dict.update(dict2) 将字典dict2中的所有元素添加到dict中
dict.values() 返回由dict中所有值组成的dict_values对象

  五:字典其他特性总结:

  1.字典是一种映射类型,是由键值对组成的,其中【字典的键】必需是不可变的类型(专业说法叫可哈希的),而且同一个字典内不能出现同样的键名;字典的值可以是任意类型,同时字典的值是可以重复的。

  

  2.字典是可变类型,因此可以对字典进行增删改查等操作。【可变与不可变参考:变量共性总结