dict(字典)

字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。

列表的缺点:
        1,列表如果存储的数据比较多,那么他的查询速度相对慢。
        2,列表存储的数据关联性不强。

python基础数据类型之一:字典。
    python中唯一的映射类的数据,花括号{}括起来,他是以键值对形式存储,每一对键值对以
    逗号隔开的。
    {'name': 'Yang', 'age': 18, 'sex': 'man'}
    ps:
        数据类型的划分:
            容器非容器划分:
                容器型数据类型:list,tuple,dict,set。
                非容器型数据类型:int str bool

            可变与不可变划分:
                可变(不可哈希hash)的数据类型:list dict,set
                不可变(可哈希hash的)的数据类型: int bool str tuple
                                    对数据本身变化:
                                    i = 100
                                    i = 90
                                    print(i)
    字典是以键值对形式存储的,
    键:不重复的,唯一的,键的数据类型必须是不可变的数据类型。
    值:任意数据类型,对象。
    字典可以存储大量的键值对数据,
    python3.5包括3.5之前:字典是无序的。
    python3.6之后,字典变成有序的。
    字典的优点:
        1,字典存储大量的关系型数据。
        2,字典的查询速度非常快。
列表的缺点:
        1,列表如果存储的数据比较多,那么他的查询速度相对慢。
        2,列表存储的数据关联性不强。

python基础数据类型之一:字典。
    python中唯一的映射类的数据,花括号{}括起来,他是以键值对形式存储,每一对键值对以
    逗号隔开的。
    {'name': 'Yang', 'age': 18, 'sex': 'man'}
    ps:
        数据类型的划分:
            容器非容器划分:
                容器型数据类型:list,tuple,dict,set。
                非容器型数据类型:int str bool

            可变与不可变划分:
                可变(不可哈希hash)的数据类型:list dict,set
                不可变(可哈希hash的)的数据类型: int bool str tuple
                                    对数据本身变化:
                                    i = 100
                                    i = 90
                                    print(i)
    字典是以键值对形式存储的,
    键:不重复的,唯一的,键的数据类型必须是不可变的数据类型。
    值:任意数据类型,对象。
    字典可以存储大量的键值对数据,
    python3.5包括3.5之前:字典是无序的。
    python3.6之后,字典变成有序的。
    字典的优点:
        1,字典存储大量的关系型数据。
        2,字典的查询速度非常快。

字典的基本操作

创建

字典的创建可以使用{},或者是dict()进行创建。

dic_ = {}
dic_1 = dict()
dic_.setdefault("name", "Yang")
dic_1.setdefault("Name", "Wang")
print(dic_, dic_1)  # {'name': 'Yang'} {'Name': 'Wang'}
dic_ = {}
dic_1 = dict()
dic_.setdefault("name", "Yang")
dic_1.setdefault("Name", "Wang")
print(dic_, dic_1)  # {'name': 'Yang'} {'Name': 'Wang'}

dic_ = dict()  # 创建字典
# 直接添加
dic_["name"] = "Tom"
print(dic_)  # {'name': 'Tom'}

# setdefault添加
# dic_.setdefault("age")  # 设置过后就不能修改,默认值为None
# print(dic_)  # {'name': 'Tom', 'age': None}

dic_.setdefault("age", 23)  # {'name': 'Tom', 'age': 23}
print(dic_)
dic_.setdefault('age', 12)  # age:23 answer:{'name': 'Tom', 'age': 23}
print(dic_)  # age:None  {'name': 'Tom', 'age': None}

dic_ = dict()  # 创建字典
# 直接添加
dic_["name"] = "Tom"
print(dic_)  # {'name': 'Tom'}

# setdefault添加
# dic_.setdefault("age")  # 设置过后就不能修改,默认值为None
# print(dic_)  # {'name': 'Tom', 'age': None}

dic_.setdefault("age", 23)  # {'name': 'Tom', 'age': 23}
print(dic_)
dic_.setdefault('age', 12)  # age:23 answer:{'name': 'Tom', 'age': 23}
print(dic_)  # age:None  {'name': 'Tom', 'age': None}

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
# pop:根据key进行删除,有返回值

ret = dic_.pop("name")
print(dic_)  # {'age': 23, 'sex': 'man'}
print(ret)  # Tom 是对应的value

# popitem  删除最后一个,也有返回值

ret = dic_.popitem()  # 删除最后一个(3.6以前是随机删除,原因的3.6以前字典无序)
print(ret)  # ('sex', 'man')
print(dic_)  # {'age': 23}

# del 删除 按照索引
del dic_["age"]  #
print(dic_)  # {}
# del dic_["age1"]  # 没有找到会报错  KeyError: 'age1'  

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}

# 清空字典  字典还存在

dic_.clear()
print(dic_)  # {}

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
# pop:根据key进行删除,有返回值

ret = dic_.pop("name")
print(dic_)  # {'age': 23, 'sex': 'man'}
print(ret)  # Tom 是对应的value

# popitem  删除最后一个,也有返回值

ret = dic_.popitem()  # 删除最后一个(3.6以前是随机删除,原因的3.6以前字典无序)
print(ret)  # ('sex', 'man')
print(dic_)  # {'age': 23}

# del 删除 按照索引
del dic_["age"]  #
print(dic_)  # {}
# del dic_["age1"]  # 没有找到会报错  KeyError: 'age1'  

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}

# 清空字典  字典还存在

dic_.clear()
print(dic_)  # {}

# 直接改

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
dic_["name"] = "xiaoming"
print(dic_)  # {'name': 'xiaoming', 'age': 23, 'sex': 'man'}

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
# update 更新
dic_1 = {"name": "Jack", "age": 12, "hobby": "sing"}
# 将dic_的数据更新到dic_1数据中
dic_1.update(dic_)
print(dic_1)  # {'name': 'Tom', 'age': 23, 'hobby': 'sing', 'sex': 'man'}
print(dic_)  # {'name': 'Tom', 'age': 23, 'sex': 'man'}

# 直接改

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
dic_["name"] = "xiaoming"
print(dic_)  # {'name': 'xiaoming', 'age': 23, 'sex': 'man'}

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}
# update 更新
dic_1 = {"name": "Jack", "age": 12, "hobby": "sing"}
# 将dic_的数据更新到dic_1数据中
dic_1.update(dic_)
print(dic_1)  # {'name': 'Tom', 'age': 23, 'hobby': 'sing', 'sex': 'man'}
print(dic_)  # {'name': 'Tom', 'age': 23, 'sex': 'man'}

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}

# 按照键(key)进行查找

ret = dic_["name"]
print(ret)  # Tom

# ret1 = dic["name1"]  # 未找到key则将报错
# print(ret1)  # KeyError: 'name1'

# get 方式进行查找,通过键进行查找

ret3 = dic_.get("age")
print(ret3)  # 23

ret4 = dic_.get("name1")  # 未找到返回None,也可以进行设置返回值
print(ret4)  # None

ret5 = dic_.get("name1", "未找到!")
print(ret5)  # 未找到!

dic_ = {'name': 'Tom', 'age': 23, "sex": "man"}

# 按照键(key)进行查找

ret = dic_["name"]
print(ret)  # Tom

# ret1 = dic["name1"]  # 未找到key则将报错
# print(ret1)  # KeyError: 'name1'

# get 方式进行查找,通过键进行查找

ret3 = dic_.get("age")
print(ret3)  # 23

ret4 = dic_.get("name1")  # 未找到返回None,也可以进行设置返回值
print(ret4)  # None

ret5 = dic_.get("name1", "未找到!")
print(ret5)  # 未找到!

其他

# 查看所有keys(键)
ret = dic_.keys()
print(ret, type(ret))  # dict_keys(['name', 'age', 'sex']) <class 'dict_keys'>

# 查看可以将其装换为list类型
print(list(ret))  # ['name', 'age', 'sex']

# 查看所有的values(值)
ret1 = dic_.values()
print(list(ret1))  # ['Tom', 23, 'man']

# 查看键值对
ret2 = dic_.items()
print(list(ret2))  # [('name', 'Tom'), ('age', 23), ('sex', 'man')]

# 对元素进行读取
for data in dic_:
    print(data, end=" ")   # 返回的是键:name age sex
print('\n')

for key in dic_.keys():  # name age sex
    print(key, end=" ")
print('\n')

for value in dic_.values():
    print(value, end=" ")  # Tom 23 man 返回字典的值
print('\n')

for item in dic_.items():
    print(item, end=" ")  # ('name', 'Tom') ('age', 23) ('sex', 'man')
print('\n')

# 对items中将key,value 进行提取
for k, v in dic_.items():
    print("key:",k, "value:", v)

'''
key: name value: Tom
key: age value: 23
key: sex value: man
'''

# fromkeys

dic = dict.fromkeys([1,2,3],'太白')
print(dic)  # {1: '太白', 2: '太白', 3: '太白'}
dic = dict.fromkeys('abcd','太白')
print(dic)  # {'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
dic = dict.fromkeys('abcd', [1, 2])
print(dic)  # {'a': [1, 2], 'b': [1, 2], 'c': [1, 2], 'd': [1, 2]}
# 坑: 如果你的值是一个可变的数据类型, 他在内存中是一个.id相同.
dic = dict.fromkeys('abcd',[])
print(dic)  # {'a': [], 'b': [], 'c': [], 'd': []}  
dic['a'].append(666)  #
print(dic)  # {'a': [666], 'b': [666], 'c': [666], 'd': [666]}
dic['b'].append(111)
print(dic)  # {'a': [666, 111], 'b': [666, 111], 'c': [666, 111], 'd': [666, 111]}
dic['c'].append(222)
print(dic) # {'a': [666, 111, 222], 'b': [666, 111, 222], 'c': [666, 111, 222], 'd': [666, 111, 222]}
# 相当于a,b,c,d共用一个列表,当a,b,c,d中的一个添加对象,则也就添加到列表中

# 查看所有keys(键)
ret = dic_.keys()
print(ret, type(ret))  # dict_keys(['name', 'age', 'sex']) <class 'dict_keys'>

# 查看可以将其装换为list类型
print(list(ret))  # ['name', 'age', 'sex']

# 查看所有的values(值)
ret1 = dic_.values()
print(list(ret1))  # ['Tom', 23, 'man']

# 查看键值对
ret2 = dic_.items()
print(list(ret2))  # [('name', 'Tom'), ('age', 23), ('sex', 'man')]

# 对元素进行读取
for data in dic_:
    print(data, end=" ")   # 返回的是键:name age sex
print('\n')

for key in dic_.keys():  # name age sex
    print(key, end=" ")
print('\n')

for value in dic_.values():
    print(value, end=" ")  # Tom 23 man 返回字典的值
print('\n')

for item in dic_.items():
    print(item, end=" ")  # ('name', 'Tom') ('age', 23) ('sex', 'man')
print('\n')

# 对items中将key,value 进行提取
for k, v in dic_.items():
    print("key:",k, "value:", v)

'''
key: name value: Tom
key: age value: 23
key: sex value: man
'''

# fromkeys

dic = dict.fromkeys([1,2,3],'太白')
print(dic)  # {1: '太白', 2: '太白', 3: '太白'}
dic = dict.fromkeys('abcd','太白')
print(dic)  # {'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
dic = dict.fromkeys('abcd', [1, 2])
print(dic)  # {'a': [1, 2], 'b': [1, 2], 'c': [1, 2], 'd': [1, 2]}
# 坑: 如果你的值是一个可变的数据类型, 他在内存中是一个.id相同.
dic = dict.fromkeys('abcd',[])
print(dic)  # {'a': [], 'b': [], 'c': [], 'd': []}  
dic['a'].append(666)  #
print(dic)  # {'a': [666], 'b': [666], 'c': [666], 'd': [666]}
dic['b'].append(111)
print(dic)  # {'a': [666, 111], 'b': [666, 111], 'c': [666, 111], 'd': [666, 111]}
dic['c'].append(222)
print(dic) # {'a': [666, 111, 222], 'b': [666, 111, 222], 'c': [666, 111, 222], 'd': [666, 111, 222]}
# 相当于a,b,c,d共用一个列表,当a,b,c,d中的一个添加对象,则也就添加到列表中

字典的嵌套

dic = {
    'name_list': ['博哥', '菊哥', 'b哥', 'alex'],
    'barry': {
        'name': '太白金星',
        'age': 18,
        'hobby': 'wife',
    }
}

# 1,给这个列表['博哥', '菊哥', 'b哥', 'alex'] 追加一个元素 '老男孩'。

dic["name_list"].append("老男孩")  # {'name_list': ['博哥', '菊哥', 'b哥', 'alex', '老男孩'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife'}}

# 2,将这个列表['博哥', '菊哥', 'b哥', 'alex']中的alex变成首字母大写。
dic["name_list"][-1] = dic["name_list"][-1].capitalize()  # {'name_list': ['博哥', '菊哥', 'b哥', 'Alex'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife'}}

# 3,将这个键值对 'name': '太白金星' 的 '太白金星' 改成男神。
dic["barry"]["name"] = "男神" # {'name_list': ['博哥', '菊哥', 'b哥', 'alex'], 'barry': {'name': '男神', 'age': 18, 'hobby': 'wife'}}

# 4,给barry对应的小字典增加一个键值对: weight: 160

dic["barry"]["weight"] = 160  # {'name_list': ['博哥', '菊哥', 'b哥', 'alex'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife', 'weight': 160}}
dic = {
    'name_list': ['博哥', '菊哥', 'b哥', 'alex'],
    'barry': {
        'name': '太白金星',
        'age': 18,
        'hobby': 'wife',
    }
}

# 1,给这个列表['博哥', '菊哥', 'b哥', 'alex'] 追加一个元素 '老男孩'。

dic["name_list"].append("老男孩")  # {'name_list': ['博哥', '菊哥', 'b哥', 'alex', '老男孩'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife'}}

# 2,将这个列表['博哥', '菊哥', 'b哥', 'alex']中的alex变成首字母大写。
dic["name_list"][-1] = dic["name_list"][-1].capitalize()  # {'name_list': ['博哥', '菊哥', 'b哥', 'Alex'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife'}}

# 3,将这个键值对 'name': '太白金星' 的 '太白金星' 改成男神。
dic["barry"]["name"] = "男神" # {'name_list': ['博哥', '菊哥', 'b哥', 'alex'], 'barry': {'name': '男神', 'age': 18, 'hobby': 'wife'}}

# 4,给barry对应的小字典增加一个键值对: weight: 160

dic["barry"]["weight"] = 160  # {'name_list': ['博哥', '菊哥', 'b哥', 'alex'], 'barry': {'name': '太白金星', 'age': 18, 'hobby': 'wife', 'weight': 160}}