在 Shell 中,数组有 2 种类型,普通数组和关联数组,两者的区别就是普通数组的索引是默认的数字索引,而关联数组的索引是可以自定义的任意字符串作索引。
本文中要提到的字典就就是和 Shell 关联数组一样的形式。
Shell 关联数组的特点是索引可以是字符串,字典也是同样的特点。
定义字典
字典定义方式与 Shell 关联数组是不一样的,采用了键值对的形式,且使用 { }
来定义。
如:定义一个人的信息
message = {'name': 'FeiYi', 'sex': 'man', 'age': '25'}
print('我叫' + message['name'] + ',今年' + message['age'] + '岁,' + '很' + message['sex'])
---
# 运行结果
我叫FeiYi,今年25岁,很man
键值对是两个相关联的值,与键相关联的值,可以是数字、字符串、列表、乃至字典,可以将任何 Python 对象用作字典中的值。
当定义字典较多时,可以使用一下格式,最后一个键值对加逗号是因为方便后续接入新的键值对
message = {
'name': 'FeiYi',
'sex': 'man',
'age': '25',
}
添加键值对
message = {}
message['name'] = 'FeiYi'
message['age'] = '25'
print(message)
---
# 运行结果
{'name': 'FeiYi', 'age': '25'}
修改键值对
message = {'name': 'FeiYi', 'sex': 'man', 'age': '25'}
print(message)
message['age'] = '26'
print(message)
---
# 运行结果
{'name': 'FeiYi', 'sex': 'man', 'age': '25'}
{'name': 'FeiYi', 'sex': 'man', 'age': '26'}
删除键值对
message = {'name': 'FeiYi', 'sex': 'man', 'age': '25'}
print(message)
del message['sex']
print(message)
---
# 运行结果
{'name': 'FeiYi', 'sex': 'man', 'age': '25'}
{'name': 'FeiYi', 'age': '25'}
遍历字典
前面的信息中,发现只有获取到键值对中的值,无法获取键,字典也可能存在大量的数据,Python 也对字典支持多种遍历方式。
遍历字典中的键和值
方法 items()
返回的是元组或数组类型,用于方便遍历
message = {
'name': 'FeiYi',
'sex': 'man',
'age': '25',
}
for key,value in message.items():
print("\nKey: " + key)
print("Value: " + value)
print(message.items())
---
# 运行结果
Key: name
Value: FeiYi
Key: sex
Value: man
Key: age
Value: 25
dict_items([('name', 'FeiYi'), ('sex', 'man'), ('age', '25')])
在普通的 for 循环中,一般只声明一个变量,如 for i in
,而对于字典来说,要想遍历的键和值,就需要用都两个变量,不需要必须是以上的 key,value
,可以是任意两个觉着有意义的变量名,前者为键,后者为值。
遍历字典中的键
方法 keys()
以列表形式返回字典中的所有键名
message = {
'name': 'FeiYi',
'sex': 'man',
'age': '25',
}
print(message.keys())
---
# 运行结果
dict_keys(['name', 'sex', 'age'])
重新举例:有几个朋友,每个朋友精通的技术不同
proficient_technology = {
'Runzi': 'Kubernetes',
'Jin': 'Python',
'San': 'PhotoShop',
'JinFeng': 'Kuaiji',
}
friends = ['JinFeng', 'Runzi']
for name in proficient_technology.keys():
print(name)
if name in friends:
print(' ' + name + '精通的技术是:' + proficient_technology[name])
---
# 运行结果
Runzi
Runzi精通的技术是:Kubernetes
Jin
San
JinFeng
JinFeng精通的技术是:会计
在遍历部分不使用 keys()
方法的结果也是一样的。
字典中获取键值是无序的,要想以特定的顺序获取键值,可以使用方法 sorted()
按键名的字母顺序临时排序,如 sorted(proficient_technology.keys())
遍历字典中的值
方法 values()
同样以列表形式返回字典中的所有值
proficient_technology = {
'Runzi': 'Kubernetes',
'Jin': 'Python',
'San': 'PhotoShop',
'JinFeng': '会计',
}
print(proficient_technology.values())
for technology in proficient_technology.values():
print(technology)
---
# 运行结果
dict_values(['Kubernetes', 'Python', 'PhotoShop', '会计'])
Kubernetes
Python
PhotoShop
会计
以上的做法可以提取出所有的值,表示你的朋友精通的所有技能,如果有人的精通技能重复,且数据量大时,最终结果会出现很多重复值,为提出重复项,可使用集合 set()
达到去重的目的,集合类似于列表,但每个元素必须是独一无二的。
proficient_technology = {
'Runzi': 'Kubernetes',
'Jin': 'Python',
'San': 'PhotoShop',
'JinFeng': '会计',
'FeiYi': 'Kubernetes',
}
print(proficient_technology.values())
print(set(proficient_technology.values()))
---
# 运行结果
dict_values(['Kubernetes', 'Python', 'PhotoShop', '会计', 'Kubernetes'])
{'会计', 'Python', 'Kubernetes', 'PhotoShop'}
练习
prog = {
'Shell': '用户使用 Linux 的桥梁',
'C': '面向过程式的计算机程序设计语言',
'C#': '面向对象的编程语言',
'Python': '解释型、高级和通用的编程语言',
'Java': '高级程序设计语言',
}
for lang,desc in prog.items():
print(lang + '语言是' + desc)
---
# 运行结果
Shell语言是用户使用 Linux 的桥梁
C语言是面向过程式的计算机程序设计语言
C#语言是面向对象的编程语言
Python语言是解释型、高级和通用的编程语言
Java语言是高级程序设计语言
proficient_technology = {
'Runzi': 'Kubernetes',
'Jin': 'Python',
'San': 'PhotoShop',
'JinFeng': '会计',
'FeiYi': 'Kubernetes',
}
name_list = ['FeiYi', 'JinFeng', 'Mi', '8k']
for name in name_list:
if name in proficient_technology.keys():
print('你好,' + name + '感谢接受调查')
else:
print(name + ',邀请您一起接受调查')
---
# 运行结果
你好,FeiYi感谢接受调查
你好,JinFeng感谢接受调查
Mi,邀请您一起接受调查
8k,邀请您一起接受调查