python常用数据结构之字典
在Python中,字典(也称为映射或哈希表)是一种存储键值对的数据结构。字典是可变的,这意味着你可以在创建后修改它们。下面是一些基本的操作来处理字典:
1. 创建字典
字典用花括号 {} 表示,键值对用冒号 : 分隔,或者在Python 3.6及以后版本中使用 dict() 函数.
# 使用花括号 >>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'} >>> person {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'} >>> # 使用dict()函数 >>> person = dict(name='Saneri',age=100,height=182,weight=78,addr='天宫一号紫金阁') >>> person {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'} >>>
2.字典的常用方法
1.> keys() 方法:返回字典中的所有键.
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
>>> person.keys()
dict_keys(['name', 'age', 'height', 'weight', 'addr'])
>>>
2.> values()方法:返回字典中的所有值。
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
>>> person.values()
dict_values(['Saneri', 100, 182, 78, '天宫一号紫金阁'])
>>>
3.> items()方法,返回字典中所有的键值对.
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
>>> person.items()
dict_items([('name', 'Saneri'), ('age', 100), ('height', 182), ('weight', 78), ('addr', '天宫一号紫金阁')])
>>> for key,values in person.items():
... print(key,values)
...
name Saneri
age 100
height 182
weight 78
addr 天宫一号紫金阁
>>>
###########################################################
#遍历取值,高效获取多值
>>> scores = {"语文": 85, "数学": 92}
>>> for subject, score in scores.items():
... print(f"{subject}成绩: {score}")
...
语文成绩: 85
数学成绩: 92
>>>
4.> get(key,default) 获取键对应的值,若键不存在返回默认值.
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
# 获取存在的键
>>> person.get('name')
'Saneri'
# 获取不存在的键,返回默认值
>>> person.get('hello',"未填写")
'未填写'
>>>
5.> pop(key) 删除指定键并返回其值,可设置默认值避免键不存在时报错.
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
# 删除age键并获取值
>>> person.pop('age')
100
>>> person.pop('Hi',0)
0
>>>
6. > 使用 update() 方法批量添加或更新键值对:
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
>>>
# 更新age并添加del键值对
>>> person.update({'age':18,'del':1868661019})
>>> person
{'name': 'Saneri', 'age': 18, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁', 'del': 1868661019}
>>>
7.> clear() 函数,清空所有键值对,保留字典对象但删除所有内容,适合需要复用字典变量的场景
>>> person = {'name': 'Saneri', 'age': 100, 'height': 182, 'weight': 78, 'addr': '天宫一号紫金阁'}
>>> person.clear()
>>> person
{}
字典的使用场景
1.> 存储配置信息
字典适合存储键值对形式的配置信息:
config = { "host": "localhost", "port": "80", "url": "http://www.baiye.com/adodbapi" } print(config["host"]) #输出localhost
2.> 统计词频
字典可以方便地统计元素出现的次数:
text = "apple English banana orange the orange" words = text.split() count = {} for word in words: count[word] = count.get(word,0) + 1 #print("word的值:",word) print("统计单词出现的数量:",count) #输出 统计单词出现的数量: {'apple': 1, 'English': 1, 'banana': 1, 'orange': 2, 'the': 1}
3.> 在一个字典中保存了股票的代码和价格,找出股价大于20元的股票并创建一个新的字典。
说明:字典推导式可以快速生成新的字典
stocks = { '寒武纪': 1346.50, '阳光电源': 197.87, '平安银行': 11.56, '西部黄金': 27.57, '三安光电': 13.70, '宁德时代': 388.80, '隆基绿能': 21.90 } # print(stocks) stocks_dict = {key: values for key,values in stocks.items() if values > 20} print(stocks_dict) # 输出: {'寒武纪': 1346.5, '阳光电源': 197.87, '西部黄金': 27.57, '宁德时代': 388.8, '隆基绿能': 21.9}
4.嵌套字典取值
结合get()和空字典默认值,安全获取嵌套结构中的值.
person = { 'name': 'Saneri', 'age': 55, 'height': 178, 'weight': 80, 'addr': ['北京市西城区百万庄大街1号'], 'car': { 'brand': 'BMW X7', 'maxSpeed': '250', 'length': 5170, 'width': 2000, 'height': 1835, 'displacement': 3.0 } } #取出字典中键是car的值. print(person.get('car')['brand']) #输出BMW X7 print(person.get('car').items()) for key,value in person.get('car').items(): print(key,':',value) #输出结果 BMW X7 dict_items([('brand', 'BMW X7'), ('maxSpeed', '250'), ('length', 5170), ('width', 2000), ('height', 1835), ('displacement', 3.0)]) brand : BMW X7 maxSpeed : 250 length : 5170 width : 2000 height : 1835 displacement : 3.0
多嵌套取值
policy = { "timestamp": "2025-07-24T16:13:02.470389", "hostname": "veritas-backup-nbu", "bppllist_details": { "EL_TOOLS_APP_10.50.1.33_vm_bak": [ "", "Policy Name: EL_TOOLS_APP_10.50.1.33_vm_bak", "Options: 0x0", "template: FALSE" ] } } for policy_name, details in policy.get('bppllist_details', {}).items(): print(policy_name) print(details)
##########输出#################
EL_TOOLS_APP_10.50.1.33_vm_bak
['', 'Policy Name: EL_TOOLS_APP_10.50.1.33_vm_bak', 'Options: 0x0', 'template: FALSE']
8.> 循环遍历
>>>
>>> person = {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}
>>> for key in person:
... print(f'{key}: {person[key]}')
...
name: 王大锤
age: 55
height: 168
weight: 60
addr: 成都市武侯区科华北路62号1栋101
>>>
9、字典推导式
字典推导式(Dictionary Comprehension),用于从现有字典中筛选符合条件的项,创建新的字典。
语法结构
{k: v for k, v in all_results.items() if v["实例名"] == hostname}
可以分解为:
-
k: v:新字典的键值对 -
for k, v in all_results.items():遍历原字典的每个键值对 -
if v["实例名"] == hostname:筛选条件
all_results 应该是一个字典,其值(v)本身也是字典,并且包含 "实例名" 这个键。
all_results = { "server001": {"实例名": "web01", "IP": "192.168.1.10", "状态": "运行中"}, "server002": {"实例名": "db01", "IP": "192.168.1.11", "状态": "运行中"}, "server003": {"实例名": "web01", "IP": "192.168.1.12", "状态": "已停止"}, "server004": {"实例名": "cache01", "IP": "192.168.1.13", "状态": "运行中"} } #推导式写法 running_servers = {k: v for k, v in all_results.items() if v["状态"] == "运行中"} print(running_servers) #普通用户写法 result = {} for key, value in all_results.items(): if value["实例名"] == "web01": result[key] = value print(result)
类的写法:
#!/usr/bin/env python #coding:utf-8 class MyClass: def __init__(self): self.all_results = { "policy_001": { "实例名": "web-server-01", "策略类型": "安全组", "端口": "80,443", "状态": "启用" }, "policy_002": { "实例名": "db-server-01", "策略类型": "防火墙", "端口": "3306", "状态": "启用" }, "policy_003": { "实例名": "web-server-01", "策略类型": "负载均衡", "端口": "80", "状态": "启用" } } def get_policy_by_hostname(self,hostname): """根据主机名获取策略""" return {k:v for k,v in self.all_results.items() if v["实例名"] == hostname} #使用示例 if __name__ == "__main__": #1. 创建实例 policy_manager = MyClass() #2. 查询web服务器的所有策略 web_policies = policy_manager.get_policy_by_hostname("web-server-01") print("Web服务器策略:", web_policies) print("找到策略数量:", len(web_policies)) #3. 查询数据库服务器的策略 db_policies = policy_manager.get_policy_by_hostname("db-server-01") print("\n数据库服务器策略:", db_policies) # 4. 查询不存在的服务器(返回空字典) no_policies = policy_manager.get_policy_by_hostname("non-existent") print("\n不存在的服务器策略:", no_policies) # 5. 遍历查询结果 print("\n--- Web服务器策略详情 ---") for policy_id, policy_info in web_policies.items(): print(f"策略ID: {policy_id}") print(f" 策略类型: {policy_info['策略类型']}") print(f" 端口: {policy_info['端口']}") print(f" 状态: {policy_info['状态']}")
字典推导式是一种简洁、高效的方式来从字典中筛选符合条件的项,是Python中非常常用的数据处理技巧。
总结
字典是 Python 中非常灵活和强大的数据结构,适合存储键值对形式的数据。
字典的常见操作包括创建、访问、添加、修改、删除和遍历。
字典的使用场景包括存储配置、统计词频、缓存数据、表示映射关系和数据分组等。

浙公网安备 33010602011771号