python字典和集合
一、 字典
1. 字典特性介绍
字典在 Python 中极为重要,是属于映射类型的数据结构。
字典有一对儿大括号组成{}
,
字典内的元素都是成对儿出现的{"a": 1}
, 他们用英文的冒号(:
)隔开, 左边叫做键(key),右边的叫值(value), 通常叫做键值对儿。
每个元素用英文的逗号 (,
) 隔开{"a": 1, "b": 2}
2. 创建字典
创建字典可以使用一对儿大括号, 也可以使用
dict()
>>> d1 = {}
>>> type(d1)
<class 'dict'>
>>> d2 = dict()
>>> type(d2)
<class 'dict'>
>>> d3 = {"size": 8096}
>>>
3. 字典的 key 和 value
3.1 字典的 key
在一个字典中,key 不允许有重复
>>> {"a": 1, "a": 10}
{'a': 10}
并且必须是 python 中不可变的数据类型
如:
整型 浮点型 布尔值 字符串 元组
>>> {1: "整型", 1.1: "浮点型", False: "布尔值", "abc": "字符串", (1,2): "元组" }
{1: '整型', 1.1: '浮点型', False: '布尔值', 'abc': '字符串', (1, 2): '元组'}
>>>
最常用的是字符串,因为比较容易有语意,易读
>>> {"user": "shark", "age": 18}
{'user': 'shark', 'age': 18}
>>>
3.2 字典中的 value
字典中的 value 可以是 Python 中任意的一个数据对象:
- 整型、浮点型、布尔值、字符串、列表、元组、字典、函数对象
>>> {'port': 3306, "height": 1.81, 'stat': True, "name": "dbserver"}
{'port': 3306, 'height': 1.81, 'stat': True, 'name': 'dbserver'}
>>> {"mysql-01": {
... "cpu": 4,
... "memroy": [4096,4096]
... }
... }
{'mysql-01': {'cpu': 4, 'memroy': [4096, 4096]}}
>>>
- 函数对象等
>>> def foo():
... print("hello")
...
>>> {"1": foo}
{'1': <function foo at 0x10f5b9e18>}
4. 获取字典中的 key 和 value
4.1 检查字典中是否存在某个 key
可以使用
in
关键字
>>> d = {"a": 1, "b": 2}
>>> 'a' in d
True
>>> 'c' in d
False
>>>
4.2 使用 []
获取指定 key 的 value
In [48]: d = {"a": 1, "b": 2}
In [49]: d['a']
Out [49]: 1
这种方式是非常的高效做法,推荐使用。
但是有个问题,假设获取字典中不存在的 key 的值
4.3 使用字典的 get()
方法
>>> dic = {'a': 1, 'b': 2}
>>> dic.get('a') # 获取到 'a' 对应的值(value)
1
>>>
>>> dic.get('c') # key 不存在字典中,则返回 None
>>>
>>> v = dic.get('c')
>>> type(v)
<class 'NoneType'>
>>> dic.get('c', '5') # key 不存在,返回指定的值
'5'
>>>
4.4 循环字典的 key 和 value
字典对象的
items()
方法会获取到字典的 key 和 value, 它是一个可迭代对象
In [49]: dic_map.values()
Out[49]: dict_values(['manufacturer', 'pod_name', 'sn'])
In [50]: for k, v in dic_map.items():
...: print(k, v)
Manufacturer manufacturer
Product Name pod_name
Serial Number sn
In [51]:
字典取值:
1 列表中嵌套字典的循环取值
d1 = [
{"host": "db_server", "ip": '192.168.1.100'},
{"host": "web_server", "ip": '192.168.2.200'}
]
for host in d1:
host_name = host.get("host")
host_ip = host["ip"]("主机名", host_name, "主机 IP", host_ip)
2 字典中嵌套字典取值
d2 = {
"db_server": {"cpu": "i5", "ip": "192.168.1.100"},
"web_server": {"cpu": "i7", "ip": "192.168.2.200"}
}
for host, info in d2.items():
cpu = info["cpu"]
ip = info['ip']
msg = host + "的 CPU 是", cpu, "IP 是", ip
print(msg)
4.5 向字典中添加键值对
[]
方式
>>> info = {}
>>> info["cpu"] = 4
>>> info["memory"] = [4096, 4096]
>>> info
{'cpu': 4, 'memory': [4096, 4096]}
>>>
循环中添加字段键值对
In [1]: from subprocess import getoutput
In [2]: cmd = "dmidecode -qt 1"
In [3]: ret = getoutput(cmd)
In [4]: ret
Out[4]: 'System Information\n\tManufacturer: Smdbmds\n\tProduct Name: KVM\n\tVersion: 3.0\n\tSerial Number: d7944669-3028-4617-8fc2-9cd3e04aad59\n\tUUID: d7944669-3028-4617-8fc2-9cd3e04aad59\n\tWake-up Type: Power Switch\n\tSKU Number: Not Specified\n\tFamily: Smdbmds\n'
In [5]: ret.splitlines()
Out[5]:
['System Information', # 注意这里没有冒号 :, 其他的有
'\tManufacturer: Smdbmds', # 注意这里前面有 Tab 键,到时候需要处理一下
'\tProduct Name: KVM',
'\tVersion: 3.0',
'\tSerial Number: d7944669-3028-4617-8fc2-9cd3e04aad59',
'\tUUID: d7944669-3028-4617-8fc2-9cd3e04aad59',
'\tWake-up Type: Power Switch',
'\tSKU Number: Not Specified',
'\tFamily: Smdbmds']
In [6]: for line in ret.splitlines():
...: if ':' in line:
...: k, v = line.split(": ")
...: print(k, v)
...:
Manufacturer Smdbmds
Product Name KVM
Version 3.0
Serial Number d7944669-3028-4617-8fc2-9cd3e04aad59
UUID d7944669-3028-4617-8fc2-9cd3e04aad59
Wake-up Type Power Switch
SKU Number Not Specified
Family Smdbmds
In [8]: prod_info = {}
...: for line in ret.splitlines():
...: if ':' in line:
...: k, v = line.split(": ")
...: # 去除前面的 \t tab 键
...: k = k.strip()
...: if k == "Manufacturer":
...: prod_info["manufacturer"] = v
...: elif k == "Product Name":
...: prod_info["prod_name"] = v
...: elif k == "Serial Number":
...: prod_info["sn"] = v
...:
...:
In [9]: pod_info
Out[9]:
{'manufacturer': 'Smdbmds',
'prod_name': 'KVM',
'sn': 'd7944669-3028-4617-8fc2-9cd3e04aad59'}
update
方式
>>> disk = {"disk": [10240]}
>>> info.update(disk)
>>> info
{'cpu': 4, 'memory': [4096, 4096], 'disk': [10240]}
>>>
4.6 字典的编程之道:用字典实现 case 语句
程序源码
data = {
"0": "zero",
"1": "one",
"2": "two",
}
while True:
arg = input(">>:")
v = data.get(arg, "nothing")
print(v)
执行程序
$ python3 hello.py
>>:0
zero
>>:1
one
>>:9
nothing
>>:
二、 集合
1 集合特性介绍
在 python 中集合看起来像是只有 key 的字典
{'disk','cpu','memory','motherboard'}
在 python 解释器中表现为 set
集合内的元素不允许重复
2. 高效创建集合和转换
set()
>>> s1 = set()
>>> type(s1)
<class 'set'>
>>>
转换
In [99]: set('disk')
Out[99]: {'d', 'i', 'k', 's'}
In [100]: set(['disk','cpu','memory'])
Out[100]: {'cpu', 'disk', 'memory'}
In [101]: set(('disk','cpu','memory'))
Out[101]: {'cpu', 'disk', 'memory'}
In [102]: set({'disk': '560G','cpu': '4'})
Out[102]: {'cpu', 'disk'}
3. 集合运算
&
交集
获取两个集合都有的元素
In [55]: s1 = {"192.168.1.51", "192.168.1.45"}
In [56]: s2 = {"192.168.1.51", "192.168.1.78"}
In [57]: s1 & s2
Out[57]: {'192.168.1.51'}
|
并集
把两个集合的元素合并在一起,产生一个新的集合
In [60]: s1 | s2
Out[60]: {'192.168.1.45', '192.168.1.51', '192.168.1.78'}
-
差集
返回第一个集合中独有的元素。
就是只保留在第一个集合中出现并且不在第二个集合中出现的元素。
In [55]: s1 = {"192.168.1.51", "192.168.1.45"}
In [56]: s2 = {"192.168.1.78", "192.168.1.51"}
In [61]: s1 - s2
Out[61]: {'192.168.1.45'}
In [62]: s2 - s1
Out[62]: {'192.168.1.78'}
-
^
异或运算获取两个集合的分别独有的元素,组合为一个新的集合对象。
In [55]: s1 = {"192.168.1.51", "192.168.1.45"}
In [56]: s2 = {"192.168.1.78", "192.168.1.51"}
In [63]: s1 ^ s2
Out[63]: {'192.168.1.45', '192.168.1.78'}