Python - 字典 - 进阶之路 - Day02

字典是另一种可变容器模型,且可存储任意类型对象,它用于存放具有映射关系的数据。

字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。
scores = {'语文': 89, '数学': 92, '英语': 93}
print(scores)

# 空的花括号代表空的dict
empty_dict = {}
print(empty_dict)

# 使用元组作为dict的key
dict2 = {(20, 30):'good', 30:'bad'}
print(dict2)
运行结果:
{'语文': 89, '数学': 92, '英语': 93}
{}
{(20, 30): 'good', 30: 'bad'}

一、 字典的基本用法

  • 通过 key 访问 value 。
  • 通过 key 添加 key-value 对。
  • 通过 key 删除 key-value 对。
  • 通过 key 修改 key-value 对。
  • 通过 key 判断指定 key-value 对是否存在。
  • 通过 key 访问 value 使用的也是方括号语法,就像前面介绍的列表和元组一样,只是此时在方括号中放的是 key,而不是列表或元组中的索引。

1. 通过 key 访问 value

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 直接通过 key 访问 value
print(stus["addr"])

# 可以通过 dict.get(key) 来访问 value
print(stus.get("addr"))

# 直接通过 key 访问 value 和 通过 dict.get(key) 来访问 value 的区别
# 分别通过以下两种方式获取一个不存在的 key
print(stus.get("name1"))    # 获取不到 key 默认返回 None
print(stus["name1"])        # 获取不到,会报错 key error
运行结果:
北京
北京
None
Traceback (most recent call last):
  File "/Users/zhulixiang/Downloads/pythonProject/thz/Day02/字典.py", line 17, in 
    print(stus["name1"])  # 获取不到,会报错 key error
KeyError: 'name1'

2. 通过 key 修改 key-value 对

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 对存在的 key-value 赋值,就会改变原有的 key-value 对
stus["age"] = 30
print(stus["age"])
print(stus)

运行结果:

30
{'name': 'lixiang', 'id': 1, 'age': 30, 'addr': '北京', 'high': 188}

3. 通过 key 增加 key-value 对

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 添加一个不存在的 key,就可以为 dict 新增 key-value 对
stus["phone"] = 110
print(stus)

stus.setdefault("email", "[email protected]")
print(stus)

# 使用 .setdefault 方法增加 key-value 对时,如果已经存在了相同的 key,那么默认是不修改的
stus.setdefault("age", "beijing")
print(stus)

运行结果:(大家可以看到 age 的 value 并没有发生改变)

{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110}
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110, 'email': '[email protected]'}
{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188, 'phone': 110, 'email': '[email protected]'}

4. 通过 key 删除 key-value 对

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}

# 通过 pop 指定 key 删除 key-value 对
stus.pop("age")
print(stus)

# 通过 del 指定 key 删除 key-value 对
del stus['id']
print(stus)

# 随即删除一个元素,虽然是随机,但是和 pop 一样实际删除的是最后一个 key-value 对
stus.popitem()
print(stus)

运行结果:

{'name': 'lixiang', 'id': 1, 'addr': '北京', 'high': 188}
{'name': 'lixiang', 'addr': '北京', 'high': 188}
{'name': 'lixiang', 'addr': '北京'}

二、 字典的常用方法 

1. 字典的格式化

import pprint


stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}

# 正常输出 stus 字典
print(stus)

# 格式化输出 stus 字典,如果不设置 width,默认行宽是 80,如果不超过 80 输出显示和 print 一样
# indent = 4 代表设置缩进 4 个字符,width = 5,代表长度是 5
pprint.pprint(stus, indent=4, width=5)

运行结果:

{'name': 'lixiang', 'id': 1, 'age': 18, 'addr': '北京', 'high': 188}
{   'addr': '北京',
    'age': 18,
    'high': 188,
    'id': 1,
    'name': 'lixiang'}

2.  字典的清空

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 清空字典
stus.clear()
print(stus)

运行结果:

{}

3. 字典的删除

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 删除字典,执行后字典不再存在
del stus
print(stus)

运行结果:

Traceback (most recent call last):
  File "/Users/zhulixiang/Downloads/pythonProject/thz/Day02/字典.py", line 55, in 
    print(stus)
NameError: name 'stus' is not defined

4. 获取字典所有的 values 和 keys

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# 字典所有的 values
stus.values()
print(stus.values())

# 字典所有的 keys
stus.keys()  
print(stus.keys())

运行结果:

dict_values(['lixiang', 1, 18, '北京', 188])
dict_keys(['name', 'id', 'age', 'addr', 'high'])

5. 字典转换二维数组

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}


# stus.items()  把字典转换成二维数组,二维数组的每个元素就是字典的 key 和 value
print(stus.items())

运行结果:

dict_items([('name', 'lixiang'), ('id', 1), ('age', 18), ('addr', '北京'), ('high', 188)])

6. 两字典之间的合并

import pprint

stus = {
    "name": "lixiang",
    "id": 1,
    "age": 18,
    "addr": "北京",
    "high": 188
}

stus2 = {"money": 2}

# 把一个字典里面的值,放到另一个字典里面
stus.update(stus2)  
pprint.pprint(stus, width=10)

运行结果:

{'addr': '北京',
 'age': 18,
 'high': 188,
 'id': 1,
 'money': 2,
 'name': 'lixiang'}

三、 字典的嵌套

import pprint

info = {
    'chenxue':{
        'age': 18,
        'addr': 'beijing',
        'cars': ['bmw','ben-z','audi']
    },
    'wanghusai': {
        'house': {
            'bj': ['海淀区','昌平区','朝阳区','西城区'],
            'sh': ['静安区','闸北区']
        },
        'money': 5000
    }
}

# chengxu 增加一辆车 car
info['chenxue']["cars"].append("tesila")
pprint.pprint(info,width=10)
print()

# wangshuai 买了昌平一套房,存款增加了 3000000
info['wanghusai']['house']['bj'].remove('昌平区')
info['wanghusai']['money'] = 3005000
pprint.pprint(info,width=10)

运行结果:

{'chenxue': {'addr': 'beijing',
             'age': 18,
             'cars': ['bmw',
                      'ben-z',
                      'audi',
                      'tesila']},
 'wanghusai': {'house': {'bj': ['海淀区',
                                '昌平区',
                                '朝阳区',
                                '西城区'],
                         'sh': ['静安区',
                                '闸北区']},
               'money': 5000}}

{'chenxue': {'addr': 'beijing',
             'age': 18,
             'cars': ['bmw',
                      'ben-z',
                      'audi',
                      'tesila']},
 'wanghusai': {'house': {'bj': ['海淀区',
                                '朝阳区',
                                '西城区'],
                         'sh': ['静安区',
                                '闸北区']},
               'money': 3005000}}

四、字符串拆分到字典

user_info = """
        aDMin,123456
        teSt1,abc123
        xiaoHei,xxxx434
        """


d = dict(x.split(",") for x in user_info.split())
print(d)

运行结果:

{'aDMin': '123456', 'teSt1': 'abc123', 'xiaoHei': 'xxxx434'}

 五、字典的 key 或者 value 统一大写或者小写

user_info = """
        aDMin,123456
        teSt1,abc123
        xiaoHei,xxxx434
        """


d = dict(x.split(",") for x in user_info.split())
print(d)
new_d = {}
for i in d:
    new_d[i.lower()] = d[i]
print(new_d)

 运行结果:

{'aDMin': '123456', 'teSt1': 'abc123', 'xiaoHei': 'xxxx434'}
{'admin': '123456', 'test1': 'abc123', 'xiaohei': 'xxxx434'}

六、字典元素的遍历 

d = {"admin": "123456", "test": "456789"}


# 这种方法效率比较高,因为是直接根据 key:value 取值
for i in d:
    print(i, d.get(i))

# 使用 item 的效果效率比较低,因为使用 item 时时先把字典转换成 list,然后才逐一去取list 的每个元素
for k, v in d.items():
    print(k, v)

 运行结果:

admin 123456
test 456789

你可能感兴趣的:(进阶之路,Python,常用的数据类型,python,字典,数据类型,数据结构,pycharm)