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 中非常灵活和强大的数据结构,适合存储键值对形式的数据。
字典的常见操作包括创建、访问、添加、修改、删除和遍历。
字典的使用场景包括存储配置、统计词频、缓存数据、表示映射关系和数据分组等。

posted @ 2025-11-05 10:55  梦徒  阅读(11)  评论(0)    收藏  举报