python -- 字典

python -- 字典

字典是用{}表示。

字典是一种key – value的数据类型。

字典的格式:

name = {
    'stu01': 'Gao',
    'stu02': 'Zhang',
    'stu03': 'Liu',
    'stu04': 'Wang',
}
name2 = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# name 和name2 打印出来的效果是一样
# <class 'dict'>
print(type(name))
# <class 'dict'>
print(type(name2))
print(name)
print(name2)

取字典的value值 dict.get('key')

name = {
    'stu01': 'Gao',
    'stu02': 'Zhang',
    'stu03': 'Liu',
    'stu04': 'Wang',
}

# Gao
print(name['stu01'])  
# 由于stud05不在字典里,所以会报错
# KeyError: 'stu05'
print(name['stu05'])
#为了避免查找key值不在的报错,建议使用
# None
print(name.get('stu05'))
# Zhang
print(name.get('stu02'))

修改字典的value值

name = {
    'stu01': 'Gao',
    'stu02': 'Zhang',
    'stu03': 'Liu',
    'stu04': 'Wang',
}

# 修改stu02的value值
name['stu02'] = '张'
# 修改stu05的value值,但是stu05这个key没有,所以就新建了一个对应关系
name['stu05'] = '李四'
# {'stu01': 'Gao', 'stu02': '张', 'stu03': 'Liu', 'stu04': 'Wang', 'stu05': '李四'}
print(name)

字典的删除 del dict['key'] dict.pop('key') dict.popitem()

name = {
    'stu01': 'Gao',
    'stu02': 'Zhang',
    'stu03': 'Liu',
    'stu04': 'Wang',
}

# {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)  
# 用del删除字典中的key值
del name['stu01']
# {'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)
# 用dict.pop('key')删除指定的key值,不过这里会有返回值
# 返回值: Wang
print(name.pop('stu04'))
# {'stu02': 'Zhang', 'stu03': 'Liu'}
print(name)
# 用dict.popitem()随机删除key值,并且返回key-value关系
# 返回值: ('stu03', 'Liu')
print(name.popitem())
# {'stu02': 'Zhang'}
print(name)

字典的生成

用户自己生成字典

dic = {}
for i in range(5):
    a  = input("Enter the dict'key:")
    b  = input("Enter the dict'value:")
    dic[a] = b
print(dic)

多级字典嵌套及操作

字典可以再套字典,最终成为一个树状结构。

map = {
    '浦西':{
        '黄浦区':{
            '城隍庙':['小吃','九曲桥','绿波廊'],
            '南京路步行街':['第一百货','沈大成','永安百货'],
        },
        '徐汇区':{
            '徐家汇':['百脑汇','汇金百货','港汇广场'],
            '龙华寺':['古寺之一','风水宝地','烧香灵'],
        },
        '静安区':{
            '马戏城':['时空之旅','马戏','特技表现'],
            '大灵灵石公园':['郁金香展','人工湖划船','婚纱拍摄地'],
        },
    },
    '浦东':{
        '浦东新区':{
            '东方明珠':['上海标志性地标','太空舱','旋转餐厅'],
            '海洋水族馆':['亚洲第一','海底隧道','28个主题馆'],
        },
        '原川沙':{
            '迪士尼乐园':['大陆第一','七大主题乐园','两座主题酒店'],
        },
        '原南汇':{
            '野生动物园':['首座国家级野生动物园','两大参观区','AAAAA'],
            '南汇鲜花港':['多肉展','百合花展','菊花展'],
        },
    },
    '崇明':{
        '中北部':{
            '东平森林公园':['AAAAA','华东区最大的人造平原森林','上海著名旅游胜地'],
        },
        '南部':{
            '西沙湿地':['候鸟','日落','观潮'],
        },
        '西部':{
            '明珠湖':['天然湖泊','鸬鹚保护地','扶摇直上'],
        },
    },
}

a = map['浦东']['原南汇']['南汇鲜花港']

# ['多肉展', '百合花展', '菊花展']
print(a)
# 多肉展
print(a[0])

字典的操作

  • keys dict.keys()
  • values dict.valuse()
name = {
    'stu01': 'Gao',
    'stu02': 'Zhang',
    'stu03': 'Liu',
    'stu04': 'Wang',
}
# 打印dict的key值
# dict_keys(['stu01', 'stu02', 'stu03', 'stu04'])
print(name.keys())
# 打印dict的value值
# dict_values(['Gao', 'Zhang', 'Liu', 'Wang'])
print(name.values())
  • setdefalut dict.setdefault('key','value')
name = {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], }
# 使用setdefault时候,对于没有的key-value会加上,如果有就忽略,不修改
# setdefault并不会将Li转换成列表的格式加入字典,还是将它作为str传入
name.setdefault('stu05', 'Li')
name.setdefault('stu04', 'LiLi')
# {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], 'stu05': 'Li'}
print(name)
  • update dict1.update(dict2)
name = {'stu01': ['Gao'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], }
dic = {'stu01': ['GG'], '1': '2', }
# 用update会将update内的字典更新到老的里面去,同时新字典中和老字典有相同key的话,新的value代替老的value
# update需要函数内的参数也要是字典
name.update(dic)
# {'stu01': ['GG'], 'stu02': ['Zhang'], 'stu03': ['Liu'], 'stu04': ['Wang'], '1': '2'}
print(name)
  • items dict.items() 返回字典dict的(key,value)元组对的列表
name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# dict.items()将字典变成一个列表,还是一个dict_items类型
# dict_items([('stu01', 'Gao'), ('stu02', 'Zhang'), ('stu03', 'Liu'), ('stu04', 'Wang')])
print(name.items())
# type = <class 'dict_items'>
tmp = name.items()
# <class 'dict_items'> todo 日后详解
print(type(tmp))
  • fromkeys dict.fromkeys(['str1','str2'],'value') 初始化一个字典,浅初始化
name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# 用fromkey是()初始化一个新的字典,并且key对于的key值都是test01
dic = dict.fromkeys([1, 2, 3], 'test01')
# fromkey是()初始化一个新的字典,并且key对于的key值都是None
dic1 = dict.fromkeys([0, 9, 8])
# {1: 'test01', 2: 'test01', 3: 'test01'}
print(dic)
#  None, 9: None, 8: None}
print(dic1)
# 下面只是初始化一个字典,但是和name这个字典没有半毛线关系。只是生成字典,并未赋值给变量name。
name.fromkeys([1, 2, 3], 'test01')
# {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang'}
print(name)  

使用fromkeys另外注意的事

通过fromkeys生产的字典,如果存在嵌套关系,在修改嵌套里的数据时,那些key也会跟着一起改变。原理同浅copy。

dic = dict.fromkeys([1, 2, 3], {'name':['ID','Sex','Age']})
# {1: {'name': ['ID', 'Sex', 'Age']}, 2: {'name': ['ID', 'Sex', 'Age']}, 3: {'name': ['ID', 'Sex', 'Age']}}
print(dic)
# 修改dic对于的1可以的name的‘ID’,为'ID Card'
dic[1]['name'][0] = 'ID Card'
# {1: {'name': ['ID Card', 'Sex', 'Age']}, 2: {'name': ['ID Card', 'Sex', 'Age']}, 3: {'name': ['ID Card', 'Sex', 'Age']}}
print(dic)

字典的循环

name = {'stu01': 'Gao', 'stu02': 'Zhang', 'stu03': 'Liu', 'stu04': 'Wang', }
# 循环打印name中的key值
for i in name:
    print(i)
# 循环打印name中的value值
for j in name:
    print(name[j])
# 建议使用以下方式打印key-value的关系,相对下面的循环,高效
for l in name:
    print(l,name[l])
# 循环打印name中的key和value值,字典转成列表的过程,在数据多的时候,就麻烦了
for k,v in name.items():
    print(k,'=',v)
# k,v 可以随意编写,因为他们就是一个临时变量而已。

写在后面

字典的特征:

  • 字典是无序的,没有下标
  • key必须是唯一,所以字典不会有重复的key
  • 取字典key值,建议使用dict.get('key')的方式
  • dict.pop('key'),返回value值,同时把相对于的key值也删除。建议使用这样方式删除dict的key。
  • dict.popitem(),随机删除key,告知key对应的value,返回值是一个元组(key,vlaue)。
  • dict1.update(dict2),会将update内的字典更新到老的里面去,同时新字典中和老字典有相同key的话,新的value代替老的value
  • dict.fromkeys(['key1','key2'],'value'),可以不依附任何原有的字典编写
  • dict.fromkeys(['key1',key2],'value'),建议只创建一层key-value关系,除非特殊使用。原因:浅copy。
  • 字典的循环,不建议使用dict.items(),因为吃资源较多,且低效。
作用 代码 用法 备注
取key keys dict.keys()
取value values dict.values()
取value get dict.get('key') 有,返回;没有。返回None
删除 del del dict['key'] 系统中功能
删除 pop dict.pop('key') 定向删除key,并且返回key对于的value值
删除 popitem dict.popitem() 随机删除一个key,并且返回key-value关系
增加 setdefault dict.setdefault('key','value') 如有,不改;没有,新增
升级 update dict1.update(dict2) 如有重复key,dict2的值替换dict1
关系图 items dict.items() 返回(key-value)对应图,列表性质
初始化 fromkeys dict.fromkeys(['key1',['key2']],'value') 初始化key-value关系,无需依附任何dict
posted @ 2017-06-22 21:14  gzz041  阅读(185)  评论(0)    收藏  举报