Python中唯一的映射类型(哈希表) -->Java中的HashMap<K,V>
Python对key进行了哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序的
字典的对象是可变,但是字典的键值必须使用不可变对象,并且一个字典中可以使用不同类型的键值
创建字典:key的设置必须是不可变的类型,可以整数,可以是变量,元组,也可以使单字符'a'【类似Java中的key的唯一性】
字典特点: 无序, 键值唯一[如遇冲突后面会覆盖前面]
字典的创建
1. 直接创建 hash = {'[1,2,3]': 'hello world'},要求key是不可变的
2. 利用dict类创建: dict(name='hhh',age=12)
3. 利用dict.fromkeys: dict.fromkeys(['test1', 'test2', 'test3'], 'hhh')
直接创建
# '[1,2,3]',将一个元组做为一个字符串传入进去,所以执行成功 hash = {'[1,2,3]': 'hello world'} print(hash) # 必须是不可变类型,这里的[1,2,3]是可变类型,不能被hash计算 unhash = {[1,2,3]: 'hello world'} print(unhash)
根据dict类创建字典:
# 注意键值不需要带引号 dic = dict(name='ftl', age=12, sex='male') # 推荐使用,py官方写法,不需要引号哈 print(dic) dd = dict((('name', 'ftl'), ('age', 13), ('sex', 'male'))) print(dd)
dict.fromkeys创建字典(有问题)
name = dict.fromkeys(['test1', 'test2', 'test3'], 'hhh') print("name ", name) name['test1'] = 'ftl' print("name修改test1属性", name) #有问题,可以查询深浅拷贝 name2 = dict.fromkeys(['test1', 'test2', 'test3'], ['hello', 'world']) print("name2 ", name2) name2['test1'][1] = 'Python' print("name2修改test1属性", name2)
字典的查询
keys, values, items, person['age'], person['school']['name']
print('-------------------------------------------------------------------------') person = {"name": "hhh", "age": 36, "school": {'name': 'xupt', 'headmaster': 'hhh2017'}} # 打印所有字典信息: print("打印所有字典信息:", person) # 根据键值取对象 print("根据键值取对象:", person['age']) # 取出学校的信息&&单独取出校长名称 print("学校信息:", person['school']) print("学校信息(校长名字):", person['school']['headmaster']) print('-------------------------------------------------------------------------') # 打印所有的keys,返回一个dict_keys类型 print("打印所有的keys,返回dict_keys类型:", person.keys()) # 打印所有的keys,转换dict_keys类型为list print("打印所有的keys,转换dict_keys类型为list:", list(person.keys())) # 打印嵌套的字典的keys print("打印嵌套的字典的keys:", person['school'].keys()) print('-------------------------------------------------------------------------') # 打印所有的values,返回一个dict_keys类型 print("打印所有的values,返回dict_values类型:", person.values()) # 打印所有的values,转换dict_keys类型为list print("打印所有的values,转换dict_values类型为list:", list(person.values())) # 打印嵌套的字典的values print("打印嵌套的字典的values:", person['school'].values()) print('-------------------------------------------------------------------------') # 打印键值对,作为一个元组存储 print("打印键值对:", person.items()) # 打印嵌套的字典的键值对 print("打印嵌套的字典的键值对:", person['school'].items()) print('-------------------------------------------------------------------------') # 如果遇到键值key冲突,则后面的会覆盖前面的key值 name = {'age': 'hello', 'age': '12'} print("键值冲突后面会覆盖前面的内容:", name) print('-------------------------------------------------------------------------')
字典的查询
字典利用get读取内容:
dic = {'name':'ftl', 'age':23, 'sex': 'male'} print(dic['name']) print(dic.get('name')) print(dic.get('school')) # 找不出来后打印None print(dic.get('school','peking')) # 找不出来后打印后面的默认值 peking 字典的判断: in 用来判断键key是否在字典中 name = {'h':'hello', 'w':'world'} print('h' in name) print('hello' in name)
字典的增加
1. 赋值添加
2. setdefault: 没有就添加,有就不改动,返回相应的键值
info = {'name': 'ftl'} print("添加信息之前:", info) # 直接赋值添加 info['age'] = 13 print("添加信息之后:", info) # setdefault有就不操作,没有就添加,并且返回一个值 real = info.setdefault('school', 'xupt') print("setdefault添加信息之后(添加信息):", info) print("setdefault返回的值:", real) real2 = info.setdefault('age', 100) print("setdefault添加信息之后(修改信息):", info) print("setdefault返回的值:", real2)
字典的修改
1. 取值后重新赋值
2. update方法
取值后重新赋值
print('-------------------------------------------------------------------------') person = {"name": "hhh", "age": 36, "school": {'name': 'xupt', 'headmaster': 'hhh2017'}} # 打印所有字典信息: print("打印所有字典信息(旧的):", person) # 根据键值修改对象 person['age'] = 100 print("根据键值修改person的:", person['age']) # 修改取出校长名称 person['school']['headmaster'] = 'python' print("学校信息(新校长名字):", person['school']['headmaster']) print('-------------------------------------------------------------------------')
Update方法修改属性:有则修改,没有则添加
person = {"name": "hhh", "age": 36, "school": 'xupt'} person2 = {'name': 'ftl', 'age': 100, 'school': 'qinghua', 'sex': 'male'} print("Pserson(old):", person) print("Pserson2(old):", person2) person.update(person2) print("Pserson(new):", person) print("Pserson2(new):", person2)
字典的删除
del : del person['age'] del person
clear: person.clear()
pop: person.pop('age') 删除并返回删除对象的value值
popitem: 默认随机删除一个key-value,并返回一个元组
person = {"name": "hhh", "age": 36, "school": 'xupt', 'sex': 'male', 'hello': 'world'} print("执行了del person['age']前:", person) del person['age'] # del person 删除了person对象 print("执行了del person['age']后:", person) real = person.pop('sex') print("person.pop('sex')后", person) print("person.pop('sex')的返回值", real) # popitem 随记删除一个,并返回一个元组 ret = person.popitem() print("person.popitem()后", person) print("person.popitem()的返回值", ret) # 清空person对象 person.clear() print("执行了clear()以后:", person)
字典的其他操作
字典的嵌套: 字典用key,列表用索引
china = { "中国": { "北京": ["首都", "直辖市"], "陕西": ["西安", "13朝古都"], "山东": ["济南", "趵突泉"], "湖南": ["长沙", "米粉"] }, "英国": {"伦敦": ["成龙", "英伦对决"]}, "美国": {"华盛顿": ['好莱坞', '美国队长']} } print(china) # 更改北京的信息 china["中国"]["北京"][1] = '长城' print(china)
字典的排序:sort() ASCII排序/数字大小排序
ic = {5: '555', 2: '990', 4: '444'} # 按照 键 排序 print(sorted(dic)) # 按照 内容 排序 print(sorted(dic.values()))
字典的遍历:
dic = {5: '555', 2: '990', 4: '444'} # 默认只打印键值 for i in dic: print(i, end=" ") # 打印key ,value print(" ----------------------------------------------------------") # 推荐这种根据键值去查找values,根据下标去查找,效率更高 for i in dic: print(i, dic[i]) print("----------------------------------------------------------") # 转换为items的时候会消耗时间 for k, v in dic.items(): print(k, v) print("----------------------------------------------------------") # 默认打印出来的是一个元组,例如 (2:222) for i in dic.items(): print(i)
字典转换字符串:str()方法
name = {'name': 'ftl', 'age': 12, 'sex': 'male'} print(str(name))
字符串转换为字典: eval
name = {'name': 'ftl', 'age': 12, 'sex': 'male'} # 字典转换字符 ss = str(name) # 字符串转换为原来的类型 ss2 = eval(ss) print(type(ss2))