手把手同你学python字典的各种姿势用法

209 阅读8分钟

认识

字典是一系列 键-值对,是一种动态结构,用 {key : value} 表示

使用

1 创建一个空字典

  • 使用花括号 {} 创建字典

    person1 = {}    
    person1['name'] = 'xiaoming'
    person1['gentle'] = '男'
    print(person1)  #打印结果:{'name': 'xiaoming', 'gentle': '男'}
    
  • 使用内置函数 dict() 创建空字典

    person2 = dict()
    print(person2)  #打印结果:{}
    person2['name'] = 'zhangsan'
    print(person2)  #打印结果:{'name': 'zhangsan'}
    
  • 使用 dict.fromkeys(keys,value) 创建字典,其中包含指定的键和默认的值

    keys::用于作为字典的键

    value:可选参数,指定的默认值,将被赋给所有键,默认值为None

    函数返回值: 返回一个新的字典,其中包含给定键作为键,给定默认值作为值

    keys = ['hobby1','hobby2','hobby3']
    value = 'running'
    person3 = dict.fromkeys(keys,value)
    print(person3)  #打印结果:{'hobby1': 'running', 'hobby2': 'running', 'hobby3': 'running'}
    

    注意:fromkeys() 方法创建的字典中,所有的键都共享相同的默认值对象,如果默认值是可变对象(列表、字典等),修改其中一个键对应的值可能会影响到其他键的值,如下:

    默认值是可变对象为字典:

    keys = ['hobby1','hobby2','hobby3']
    value = {
        'choice1': 'running',
        'choice2': 'baseball'
    }
    person3 = dict.fromkeys(keys,value)
    print(person3)
    person3['hobby1']['choice1'] = 'eating'
    print(person3)
    #打印结果: 每个键的hobby1的choice都变为eating
    {'hobby1': {'choice1': 'running', 'choice2': 'baseball'}, 'hobby2': {'choice1': 'running', 'choice2': 'baseball'}, 'hobby3': {'choice1': 'running', 'choice2': 'baseball'}}
    {'hobby1': {'choice1': 'eating', 'choice2': 'baseball'}, 'hobby2': {'choice1': 'eating', 'choice2': 'baseball'}, 'hobby3': {'choice1': 'eating', 'choice2': 'baseball'}}
    

    默认值是可变对象为列表:

    value = ['running','baseball']
    person3['hobby1'][0] = 'eating' #将键hobby1的running修改为eating
    #打印结果为:{'hobby1': ['eating', 'baseball'], 'hobby2': ['eating', 'baseball'], 'hobby3': ['eating', 'baseball']}
    

    而如果修改键对应的值,而不是修改默认值对象本身,则不会影响到其他键

    person3['hobby1'] = 'eating'
    #结果为:{'hobby1': 'eating', 'hobby2': {'choice1': 'running', 'choice': 'baseball'}, 'hobby3': {'choice1': 'running', 'choice': 'baseball'}}
    

2 访问字典中的值

如下字典person包含两个 键-值对,依次指定字典名和键来获取与键相关联的值

person = {'name':'lihua','age':'18'}
print(person['name'])   #打印结果:lihua
print(person['age'])    #打印结果:18

3 添加 键-值 对

在A处新增两个 键-值对,其中键分别为 ’height‘ 、 'weight'

person = {'name':'lihua','age':18}  #A
print(person)   #打印结果:{'name': 'lihua', 'age': 18}
person['height'] = '182cm'
person['weight'] = '80kg'
print(person)   #打印结果:{'name': 'lihua', 'age': 18, 'height': '182cm', 'weight': '80kg'}

4 修改字典中的值

将年龄age值修改为20:

person1 = {'name': 'lihua', 'age': 18, 'height': '182cm', 'weight': '80kg'}
person1['age'] = 20
print(person1)  #打印结果:{'name': 'lihua', 'age': 20, 'height': '182cm', 'weight': '80kg'}

5 删除键-值对

对于不再需要的数据,可以使用 del语句将相应的键-值对彻底删除,使用del语句时,必须指定字典名和要删除的键

person1 = {'name': 'lihua', 'age': 18, 'height': '182cm', 'weight': '80kg'}
del person1['weight']
print(person1)  #打印结果:{'name': 'lihua', 'age': 18, 'height': '182cm'}

6 类似多个对象组成的字典

前面的字典person存储的是一个对象(人)的多种信息,也可以使用字典存储多个对象的同一种信息,如下表示zhangsan、lisi、wangwu等人的身高。

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm'
}
print("zhangsan's height is "+ heights['zhangsan']) #打印结果:zhangsan's height is 175cm

7 复制字典

使用 copy() 方法对字典进行复制

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm',
    'lihua':'171cm'
}
copy_heights = heights.copy()
print(copy_heights) #打印结果:{'zhangsan': '175cm', 'lisi': '180cm', 'wangwu': '171cm', 'lihua': '171cm'}

遍历字典

可遍历字典中的所有 键-值对、键或值

1 遍历所有的 键-值对

声明变量 name,height 用于存储键和值,方法items() 返回一个键-值对列表,for循环依次将每个键-值对存储到指定的变量 name,height 中。

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm'
}
for name,height in heights.items():
    print("Key: "+key)  
    print("Value: "+value)
#打印结果如下:
Name: zhangsan
Height: 175cm
Name: lisi
Height: 180cm
Name: wangwu
Height: 171cm

2 遍历字典中的所有键

不需要使用字典中的值时,可以用 key() 方法获取字典中的所有键

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm'
}
for name in heights.keys(): #keys() 提取键,并依次存储到name中
    print(name.title())
#打印结果:
Zhangsan
Lisi
Wangwu

也可以省略 keys() 方法,也能获取键

for name in heights:
    print(name.title())

方法 keys() 并非只能用于遍历,实际上它返回的是一个列表,其中包含字典中的所有键。

def keys(self) -> dict_keys[_KT, _VT]: ...

举个栗子,判断 Tom 是否也测量了身高,打印结果为:Tom didn't measure his height。这里使用 key in dict 方法来判断,如果键在字典中则返回 True,否则返回 False。

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm'
}
if 'Tom' not in heights.keys():
    print("Tom didn't measure his height.") 
else:
    print("Tom's height is "+person1['Tom'])

3 按顺序遍历字典中所有键

以特定顺序返回元素,可以在 for 循环中对返回的键进行排序,排序使用可以 sorted() 方法临时排序。先列出字典中的所有键,并在遍历前对整个列表排序。

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm'
}
for name in sorted(heights.keys()):
    print(name.title()) 
打印结果:
Lisi
Wangwu
Zhangsan

4 遍历字典中的所有值

不需要使用字典中的键时,可以用 values() 方法获取键对应的值。使用 values() 方法提取字典中的每个值,并依次存储到weight中,同样 values() 返回的实际也是一个列表

heights = {
    'zhangsan':'175cm',
    'lisi':'180cm',
    'wangwu':'171cm',
    'lihua':'171cm'
}
for height in heights.values():
    print(weight)
#打印结果:
175cm
180cm
171cm
171cm

但weights字典中, wangwu和lihua的身高同为 171cm,使用上述方法提取字典值时,相同的结果会重复输出。而如果数据量比较大且包含大量重复项时,可以使用 集合 set 去重。 集合是每个元素都独一无二的列表。

for height in set(heights.values()):
    print(height)
#打印结果:
175cm
180cm
171cm

嵌套

将字典存储在列表中,即列表中嵌套字典

1 字典列表

如果团队中有 张三、李四、王五三个人,先创建三个字典分别存储各人的基本信息,persons列表存储这三个字典。

person1 = {'name': 'zhangsan', 'age': 18, 'height': '182cm', 'weight': '80kg'}
person2 = {'name': 'lisi', 'age': 15, 'height': '175cm', 'weight': '60kg'}
person3 = {'name': 'wangwu', 'age': 17, 'height': '180cm', 'weight': '65kg'}
persons = [person1,person2,person3]
for person in persons:
    print(person)
​

但团队中可能不止三个人时,可以先创建个空列表用于存储人,再使用range() 方法创建10个人,然后显示前3个人。对于代码中出现的切片如果不熟悉的可以上一篇笔记##########

persons = []
for person_id in range(10): #创建10个人
    new_person = {'name':'lihua','age':'18'}
    persons.append(new_person)
for person in persons[:3]:  #切片操作显示前3个人
    print(person)
print("共创建的人数的为:"+ str(len(persons)))
​
#打印结果为:
{'name': 'lihua', 'age': '18'}
{'name': 'lihua', 'age': '18'}
{'name': 'lihua', 'age': '18'}
共创建的人数的为:10

2 在字典中存储列表

person  = {
    'name':'lihua',
    'hobby':['running','basketball','swimming']
    }
print(person['name'] + "有三个爱好,分别是:")
for hobby in person['hobby']:
    print(hobby)
#打印结果:
lihua有三个爱好,分别是:
running
basketball
swimming

如下使用字典persons存储三个人的爱好,其中使用 name存储每个人姓名,列表 hobbies 存储每个人的爱好。在遍历字典的主循环中,又使用一个for循环遍历每个人的爱好。

persons  = {
    'lihua': ['running','basketball','swimming'],
    'zhangsan': ['eating','sleeping'],
    'wangwu': ['baseball','football']
    }
for name,hobbies in persons.items():
    print(name + "的爱好分别是:")
    for hobby in hobbies:
        print(hobby)
打印结果:
lihua的爱好分别是:
running
basketball
swimming
zhangsan的爱好分别是:
eating
sleeping
wangwu的爱好分别是:
baseball
football

3 字典中存储字典

persons字典中有三个键,即 lihua、zhangsan、wangwu三个人,每个人有年龄和身高。将姓名作为键,个人信息存储在一个字典中。在for循环中先遍历字典 persons,使用name存储每个键,并使用 info 存储与当前键相关联的字典。

persons  = {
    'lihua': {
        'age': 18,
        'height': '180cm'
    },
    'zhangsan': {
        'age':17,
        'height': '177cm'
    },
    'wangwu': {
        'age': 18,
        'height': '181cm'
    }
}
for name,info in persons.items():
    age = info['age']
    height = info['height']
    print(name + "的基本信息为" + str(age) + "岁, " + str(height))
    
#打印结果:
lihua的基本信息为18岁, 180cm
zhangsan的基本信息为17岁, 177cm
wangwu的基本信息为18岁, 181cm

总结

字典相关内置方法

  • dict.keys():返回键的视图对象
  • dict.values():返回值的视图对象
  • dict.items(): 以列表返回键值对的视图对象
  • dict.fromkeys():创建一个新字典,以序列seq中元素作为字典的键,val作为字典键对应的值
  • get(key, default=None):根据给定的键返回对应的值,如果键不存在则返回默认值(默认为 None)。
  • pop(key, default=None):根据给定的键删除字典中对应的键值对,并返回对应的值。如果键不存在且没有提供默认值,则会引发 KeyError 异常。
  • popitem():随机删除并返回字典中的一个键值对。
  • clear():清空字典,移除所有的键值对。
  • update(other):将另一个字典或可迭代对象中的键值对更新到当前字典中。
  • copy():创建并返回当前字典的一个副本。
  • len():返回字典中键值对的数量。
  • in:用于检查给定的键是否存在于字典中。