字典

简单示例–外星人,存储一些外星人的信息

alien_0 = {'color': 'green','points': '5'}
print(alien_0['color'])
print(alien_0['points'])
##输出
green
5

使用字典

​ 字典是一系列键值对-key-value。每一个键都和一个值相关联,你可以通过键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表、或者还是字典。
键与值之间用冒号分隔,每个键值对用逗号分隔

访问字典中的值
可以直接用print输出

print(字典名['键名'])

也可以进行赋值后再输出

new_data = 字典名['键名']
print(new_data)

拿外星人字典举例–每个外星人都有与之对应的点数,如果把外星人击杀了就会显示你得到多少点

alien_0 = {'color': 'green','points': '5'}
print('你击杀了'+alien_0['color']+'获得了'+alien_0['points'])

##你还可以这样
alien_color=alien_0['color']
alien_point=alien_0['points']
print('你击杀了'+alien_color+'获得了'+alien_point)
添加键值对

​ 字典是一种动态节后,可随时在其中添加键值对。要添加键值对,可依次指定字典名,用方括号括器键和关联的值。
​ 要给外星人添加x坐标和y坐标,让它能够可以再屏幕特定位置显示该外星人

alien_0 = {'color': 'green','points': '5'}
print(alien_0)
alien_0['x_location'] = 0
alien_0['y_location'] = 0
print(alien_0)

##查看输出结果
#这是添加前的结果
{'color': 'green', 'points': '5'}
#添加后的结果
{'color': 'green', 'points': '5', 'x_location': 0, 'y_location': 0}

python可以先创建一个空字典再往空字典里面加内容

alien_1 = {}
alien_1['color'] = 'yellow'
alien_1['points']= 3
print(alien_1)

##执行
{'color': 'yellow', 'points': 3}
修改字典的值
aline_2 = {'color': 'green'}
print('这个外星人的颜色是'+aline_2['color'])
aline_2['color'] = 'red'
print('修改后外星人的颜色是'+aline_2['color'])

#执行
这个外星人的颜色是green
修改后外星人的颜色是red

​ 现在我们定义外星人的移动速度,按照移动速度来判断外星人向右移动多远(medium:中等,slow:特别慢,fast:特别快)

aline_3 = {'x_location': 0, 'y_location': 15, 'speed': 'medium'}
#移动的位置
print(aline_3['x_location'])
#判读如果速度为中等,就向右移动2步
if aline_3['speed'] == 'medium':
    aline_3['x_location'] += 2
#如果速度是很慢就移动一步
elif aline_3['speed'] == 'slow':
    aline_3['x_location'] += 1
#如果特别快就移动4步
else:
    aline_3['x_location'] += 4
#移动后的位置
print(aline_3['x_location'])
删除键值对

​ 对于字典中不再需要的信息,可以使用del语句将键值对彻底删除

aline_4 = {'color': 'green', 'points': 5}
print(aline_4)
#删除
del aline_4['points']
#删除后输出
print(aline_4)

#执行
{'color': 'green', 'points': 5}
{'color': 'green'}

作业

​ 使用一个字典来存储一个熟人的信息,包括名、姓、年龄和居住的城市。亥字典应包含键first_name、last_name、age和city。将存储在该字典中的每项信息都打印出来。

people = {'first_name': '谭', 'last_name': '畅', 'age': 18, 'city': '益阳'}
print('我姓'+people['first_name'])
print('名'+people['last_name'])
##应为输出要为字符串类型,使用str()函数来强转为字符串
print('年龄'+ str(people['age']))
print('来自'+people['city'])

##执行结果
我姓谭
名畅
年龄18
来自益阳

遍历字典

​ 一个字典可能包成千上万个键值对。Python支持对字典单独遍历。

遍历所有的键值对
user_0 = {
    'username': 'tom',
    'like_color': 'red',
    'like_food': 'apple'
}
#用for循环进行遍历
#items()函数是返回一个键值对的元组数组
for key,value in user_0.items():
    #输出键
    print("key:"+key)
    #输出值
    print("value:"+value)
##执行
key:username
value:tom
key:like_color
value:red
key:like_food
value:apple

遍历字典中的所有键

不需要字典中的值的时候使用keys()很有用
languages = {
    '小明': 'java',
    '小强': 'C',
    '小红': 'Python'
}
##key()只提取键
for name in languages.keys():
    print(name.title())
##执行后
小明
小强
小红

可以再创建一个新的列表,列表中存储朋友的名字,再加上if判断语句,如果遍历出来的值再列表中则输出一句话

languages = {
    '小明': 'java',
    '小强': 'C',
    '小红': 'Python'
}
people = ['小红']
for name in languages.keys():
    print(name.title())
    ##判断这个键是否存在于people列表,存在则输出一句话
    if name in people:
        print(name+' very like'+languages[name])

还可以判断某个人是否存在于字典

languages = {
    '小明': 'java',
    '小强': 'C',
    '小红': 'Python'
}
if '小王' not in languages.keys():
    print('小王没有被采访')

可以是用函数sorted来对字典进行按顺序遍历

languages = {
    'tom': 'java',
    'jen': 'C',
    'gil': 'Python'
}
for name in sorted(languages.keys()):
    print(name+',谢谢你能接受我的采访')
遍历所有值

​ 可以使用values()来遍历字典中包含的值

languages = {
    'tom': 'java',
    'jen': 'C',
    'gil': 'Python',
    'pete': 'Go',
    'lina': 'Ruby'
}
print("有一下编程语言:")
##提取值
for language in languages.values():
    print(language)
##输出
java
C
Python
Go
Ruby

假如字典的值有多个重复的,但是你又不想看见那多重复的,可以使用set()集合,类似于列表,但是每个元素都必须是独一无二的。

languages = {
    'tom': 'java',
    'jen': 'C',
    'gil': 'Python',
    'pete': 'Python',
    'lina': 'Python'
}
print("有一下编程语言:")
for language in set(languages.values()):
    print(language)
##执行后
有一下编程语言:
Python
java
C

​ 创建一个字典,在其中存储三条大河流及其流经的国家。其中一个键值对可能是'nile' : 'egypt '。
​ 使用循环为每条河流都打印一条消息
​ 使用循环将该字典中每条河流的名字都打印出来
​ 使用循环将该字典包含的每个国家的名字都打印出来

totals = {
    "nile": 'egypt',
    'yangtze': 'china',
    'amazon River': 'brazil'
}

for totals, country in totals.items():
    print("这是"+totals+"河,"'它流经过'+country,)
###执行
这是nile河,它流经过egypt
这是yangtze河,它流经过china
这是amazon River河,它流经过brazil

嵌套

​ 字典可以存储在字典内,列表也可以,甚至你可以在字典中嵌套字典,然后再嵌套字典,再嵌套字典……

字典列表

​ 有时候你的字典里面只能存储一个人的信息,假如一个人一个字典,成千上万个字典,不好管理,所以就可以使用到字典列表,

##这里我就以之前外星人来举列
##定义了4个外星人
alien_0 = {'color': 'green', 'points': '5'}
alien_1 = {'color': 'red', 'point': '8'}
alien_2 = {'color': 'yellow', 'point': '6'}
alien_3 = {'color': 'blue', 'point': '10'}
##把外星人字典加入这个列表
aliens = [alien_0, alien_1, alien_2, alien_3]

for i in aliens:
    print(i)
##执行
{'color': 'green', 'points': '5'}
{'color': 'red', 'point': '8'}
{'color': 'yellow', 'point': '6'}
{'color': 'blue', 'point': '10'}

假如外星人特别多,你不可能一个一个的打上去。所以他们都是随机生成的,我们使用range()来生成40个外星人试一下

##range(30) == range(0,30)
for i in range(30):
    alien = {'num': i, 'color': 'green', 'points': '5', 'speed': 'slow'}
    aliens.append(alien)
###打印出前10个外星人
for i in aliens[0:10]:
    print(i)
print('...')
print('一共有'+str(len(aliens))+'个外星人')

##执行
{'num': 0, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 1, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 2, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 3, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 4, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 5, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 6, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 7, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 8, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 9, 'color': 'green', 'points': '5', 'speed': 'slow'}
...
一共有30个外星人

​ 但是现在外星人都是一样,一般游戏中的外星人会有多个外星人,或者再游戏后期会出现其他的外星人,需要修改,可以通for循环和列表的切片来修改

##修改外星人数据
for i in range(30):
    alien = {'num': i, 'color': 'green', 'points': '5', 'speed': 'slow'}
    aliens.append(alien)

##修改前5个外星人
for i in aliens[0:5]:
    ##如果外星人颜色为绿色
    if i['color'] == 'green':
        i['color'] = 'red'
        i['points'] = '8'
        i['speed'] = 'medium'

###打印出前10个外星人
for i in aliens[0:10]:
    print(i)
print('...')
print('一共有'+str(len(aliens))+'个外星人')

##执行后
{'num': 0, 'color': 'red', 'points': '8', 'speed': 'medium'}
{'num': 1, 'color': 'red', 'points': '8', 'speed': 'medium'}
{'num': 2, 'color': 'red', 'points': '8', 'speed': 'medium'}
{'num': 3, 'color': 'red', 'points': '8', 'speed': 'medium'}
{'num': 4, 'color': 'red', 'points': '8', 'speed': 'medium'}
{'num': 5, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 6, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 7, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 8, 'color': 'green', 'points': '5', 'speed': 'slow'}
{'num': 9, 'color': 'green', 'points': '5', 'speed': 'slow'}
...
一共有30个外星人
字典中存储列表

​ 有时候你单单使用字典不行,需要再字典里面添加列表,比如三大河流流经的国家,这些国家可以凑成一个列表

rivers = {
    'Nile': ['egypt', 'Rudawan', 'Uganda', 'Kenya', 'Sudan', 'Ethiopia'],
    'Yangtze': 'China',
    'Amazon': ['peru', 'colombia', 'brazil', 'Venezuela', 'Bolivia', 'Ecuador'],
}

for name, countrys in rivers.items():
    print(name+'流经的国家有:')
    if type(countrys) != list:
        print('\t'+countrys)
    else:
        for country in countrys:
            print('\t', country)
 ##执行
Nile流经的国家有:
     egypt
     Rudawan
     Uganda
     Kenya
     Sudan
     Ethiopia
Yangtze流经的国家有:
    China
Amazon流经的国家有:
     peru
     colombia
     brazil
     Venezuela
     Bolivia
     Ecuador

​ 字典里都可以存列表了,字典当然也可以存,我们可以在字典里面存储每用户的信息

users = {
    '小明': {
        'game_name': 'xiaomin',
        'level': '10',
        'game_day': '4'
    },
    '小强': {
        'game_name': 'xiaoqiang',
        'level': '100',
        'game_day': '64'
    }
}

for user, data in users.items():
    user_game_name = data['game_name']
    user_level = data['level']
    user_game_day = data['game_day']
    print(user+'玩这个游戏已经'+user_game_day+'天了,他的游戏名是'+user_game_name+'等级是'+user_level)
##执行
小明玩这个游戏已经4天了,他的游戏名是xiaomin等级是10
小强玩这个游戏已经64天了,他的游戏名是xiaoqiang等级是100

​ 创建多个字典,对于每个字典,都使用一个宠物的名称来给它命名;在每个字典中,包含宠物的类型及其主人的名字。将这些字典存储在一个名为 pets 的列表中,再遍历该列表,并将宠物的所有信息都打印出来。

pet_0 = {'name': 'xiaohuang', 'owner': 'xiaohua', 'type': 'dog'}
pet_1 = {'name': 'xiaobai', 'owner': 'xiaoliu', 'type': 'cat'}

pets = [pet_0, pet_1]

for i in pets:
    print(i)

##执行
{'name': 'xiaohuang', 'owner': 'xiaohua', 'type': 'dog'}
{'name': 'xiaobai', 'owner': 'xiaoliu', 'type': 'cat'}