Python 字典Dict概念和操作

#   字典概念:无序的, 可变的键值对集合
#   定义

# 方式1
#     {key: value, key: value...}
#     例如
#         {"name": "xin", "age": 18}

d = {"name": "xin", "age": 18}
print(d, type(d))   #{'name': 'xin', 'age': 18} <class 'dict'>
print(d["name"]) # xin

# 方式2
#     fromkeys(S, v=None)
#         静态方法
#             类和对象都可以调用
#         类调用
#             dict.fromkeys("abc", 666)
#                 {'a': 666, 'c': 666, 'b': 666}
#             此处的dict, 是指字典类型
#         对象调用
#             dic.fromkeys("abc", 666)
#                 {'a': 666, 'c': 666, 'b': 666}
#             此处的dic, 是实例化的字典对象
d = dict.fromkeys("abc",888)
d1 = dict.fromkeys([1,2,3], 888)
print(d)    #{'a': 888, 'b': 888, 'c': 888}
print(d1)   #{1: 888, 2: 888, 3: 888}

# 注意
#     key不能重复
#         如果重复
#         后值会把前值覆盖
#     key必须是任意不可变类型
#         例如
#             可变
#                 列表
#                 字典
#                 可变集合
#                 ...
#             不可变
#                 数值
#                 布尔
#                 字符串
#                 元组
#                 ...
#     原因
#         Python的字典, 采用哈希(hash)的方式实现
#         简单存储过程
#             初始化一个表格, 用来存放所有的值
#                 这个表格称之为"哈希表"
#                 暂且可理解为我们所学的 "列表"
#             在存储一个键值对的时候, 会作如下操作
#                 根据给定的key, 通过某些操作, 得到一个在"哈希表"中的索引位置
#                     把key通过 "哈希函数" 转换成一个整型数字
#                         称为 "哈希值"
#                     将该数字对数组长度进行取余,取余结果就当作数组的下标
#                     如果产生了"哈希冲突"
#                         比如, 两个不同的key, 计算出来的索引, 是同一个
#                         则采用"开发寻址法"
#                             通过探测函数查找下一个空位
#                 根据索引位置, 存储给定的"值"
#         简单查找过程
#             再次使用哈希函数将key转换为对应的列表的索引,并定位到列表的位置获取value

#怎么知道是可变和不可变的值,可以通过id来观察地址
num = 10
print(id(num))
num = 20
print(id(num))  #和上面的结果地址是不同的,代表赋值后又重新生成一个地址空间,原来地址的值不变,所以就代表不可变类型

#下面是个可变类型
nums = [1, 2, 3]
print(id(nums))
nums.append(4)
print(id(nums)) #和上面的结果地址相同,代表可变类型

# 存在意义
#     可以通过key, 访问对应的值, 使得这种访问更具意义
#         person["name"]
#         表述的是获取一个人的姓名
#     查询效率得到很大提升
#         可想象"汉字字典"的使用方式
#             直接根据指定的key找到对应的页码, 从而找到这个汉字
#             不需要一页一页的翻着找

# -----------------------------------------------------常用操作------------------------------#
#
# dic[key] = value
# 当key在原字典中不存在时, 即为新增操作

#
# del dic[key]
# key, 必须要存在
# dic.pop(key[, default])
# 删除指定的键值对, 并返回对应的值
# 如果key, 不存在, 那么直接返回给定的default值;
# 不作删除动作
# 如果没有给定默认值, 则报错

# dic.popitem()
# 删除按升序排序后的第一个键值对, 并以元组的形式返回该键值对
# 如果字典为空, 则报错
#

# dic.clear()
# 删除字典内所有键值对
# 返回None
# 注意, 字典对象本身还存在, 只不过内容被清空
# 注意和del的区别
#
# 只能改值, 不能改key
# 修改单个键值对

# dic[key] = value
# 直接设置, 如果key不存在, 则新增, 存在则修改
# 批量修改键值对

# oldDic.update(newDic)
# 根据新的字典, 批量更新旧字典中的键值对
# 如果旧字典没有对应的key, 则新增键值对
oldDict = {"name": "xin", "age": 18}
newDict = {"age": 28, "address": "china"}
oldDict.update(newDict)
print(oldDict)  #{'name': 'xin', 'age': 28, 'address': 'china'}

#
# 获取单个值
# 方式1
# dic[key]
# 如果key, 不存在, 会报错

#
# 方式2
# dic.get(key[, default])
# 如果不存在对应的key, 则取给定的默认值default
# 如果没有默认值, 则为None
# 但不会报错
# 但是, 原字典不会新增这个键值对


# 方式3
# dic.setdefault(key[, default])
# 获取指定key对应的值
# 如果key不存在, 则设置给定默认值, 并返回该值
# 如果默认值没给定
# 则使用None代替

# 获取所有的值
# dic.values()
d = {"name": "xin", "age": 18}
print(d.values())   #dict_values(['xin', 18])

# 获取所有的键
# dic.keys()
print(d.keys())   #dict_keys(['name', 'age'])

# 获取字典的键值对
# dic.items()
# 遍历
# for in
#     for x, y in info.items()
# 注意
# Python2.x和Python3.x版本之间关于获取键, 获取值, 获取item, 之间的区别
# Python2.x
# 直接是一个列表
# 可通过下标进行获取指定元素
# Python3.x
# 中是Dictionary
# view
# objects
# 优势
# 当字典发生改变时, view
# objects会跟着发生改变
# 转换成列表使用
# list(result)
# 转换成迭代器
# iter(result)
# 也可以直接被遍历
# 在Python2.x中提供了如下方法
# viewkeys()
# viewvalues()
# viewitems()
# 作用如同Python3.x中的
# Dictionary
# view
# objects
# 计算
# len(info)
# 键值对的个数
# 判定
# x in dic
# 判定dic中的key, 是否存在x
# x not in dic
# 判定dic中的key, 是否不存在x
# dic.has_key(key)
# 已过期, 建议使用in来代替

 

posted @ 2018-02-23 13:10  delphiclub  阅读(648)  评论(0编辑  收藏  举报