《字典》

  • 时间:2025-11-19 19:53 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:一、字典基础操作1. 字典的定义与特性定义:字典是无序的键值对集合,用花括号{}定义,键值对间用冒号:分隔,项间用逗号,分隔。empty_dict = {} # 空字典 person = {"name": "张三", "age": 25} # 基础字典 nested_dict = {"info": {"city": "北京"}} # 嵌套字典 特性:键

一、字典基础操作

1. 字典的定义与特性

  • 定义:字典是无序的键值对集合,用花括号{}定义,键值对间用冒号:分隔,项间用逗号,分隔。
empty_dict = {}                      # 空字典
person = {"name": "张三", "age": 25}  # 基础字典
nested_dict = {"info": {"city": "北京"}}  # 嵌套字典
  • 特性
    • 键唯一性:键必须唯一,重复键会覆盖值。
    • 键可哈希:键必须是不可变类型(如字符串、数字、元组),列表、字典等不可作为键。
    • 值任意性:值可以是任意类型(包括可变类型)。
    • 高效查询:通过键直接访问值,时间复杂度为O(1)。

2. 字典的基本操作

  • 访问值
print(person["name"])  # 输出:张三
  • 修改值
person["age"] = 26     # 直接修改
person["city"] = "上海" # 新增键值对(若键不存在)
  • 删除键值对
del person["age"]      # 删除指定键
age = person.pop("city") # 删除并返回值
  • 检查键是否存在
print("name" in person)  # 输出:True

二、字典进阶技巧

1. 字典推导式(Dictionary Comprehension)

用简洁语法快速生成字典,替代复杂的循环和条件判断。

# 将列表转换为字典(键为元素,值为长度)
words = ["apple", "banana", "cherry"]
length_dict = {word: len(word) for word in words}
print(length_dict)  # 输出:{'apple': 5, 'banana': 6, 'cherry': 6}

# 筛选符合条件的键值对
even_dict = {k: v for k, v in length_dict.items() if v % 2 == 0}
print(even_dict)  # 输出:{'banana': 6, 'cherry': 6}

2. 合并字典

  • Python 3.9+:直接使用|运算符合并。
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = dict1 | dict2  # 输出:{'a': 1, 'b': 3, 'c': 4}
  • 通用方法:使用update()或{**dict1, **dict2}。
merged = {**dict1, **dict2}  # 后面的键值对会覆盖前面的

3. 默认值处理

  • get(key, default):安全获取值,避免KeyError。
print(person.get("age", 0))  # 输出:25(键存在)
print(person.get("gender", "男"))  # 输出:男(键不存在)
  • collections.defaultdict:自动为缺失键提供默认值。
from collections import defaultdict
counts = defaultdict(int)  # 默认值为0
counts["apple"] += 1
print(counts["apple"])  # 输出:1(无需预先初始化)

三、字典内置方法详解

以下是Python字典最常用的方法及其用法:

方法

作用

示例

keys()

返回所有键的视图

print(person.keys()) → dict_keys(['name', 'age'])

values()

返回所有值的视图

print(person.values()) → dict_values([25, '上海'])

items()

返回所有键值对的视图

print(person.items()) → dict_items([('name', '张三'), ('city', '上海')])

update(other)

合并另一个字典到当前字典

person.update({"age": 26}) → 更新age为26

pop(key[, default])

删除并返回指定键的值

age = person.pop("age") → 返回25,person中age被删除

popitem()

随机删除并返回一个键值对

key, value = person.popitem() → 删除最后一个键值对

clear()

清空字典

person.clear() → {}

copy()

浅拷贝字典

new_dict = person.copy()

fromkeys(seq[, value])

用序列创建新字典,值默认为value

seq = ["a", "b"]; new = dict.fromkeys(seq, 0) → {'a': 0, 'b': 0}


四、实际案例:字典的综合应用

案例1:统计文本词频

text = "Python is great and Java is also great"
words = text.split()

# 统计词频
frequency = {}
for word in words:
    frequency[word] = frequency.get(word, 0) + 1

print(frequency)  # 输出:{'Python': 1, 'is': 2, 'great': 2, 'and': 1, 'Java': 1, 'also': 1}

案例2:模拟缓存系统(LRU缓存)

from collections import OrderedDict

class LRUCache:
    def __init__(self, capacity):
        self.cache = OrderedDict()
        self.capacity = capacity
    
    def get(self, key):
        if key not in self.cache:
            return -1
        # 将访问的键移动到末尾(最近使用)
        self.cache.move_to_end(key)
        return self.cache[key]
    
    def put(self, key, value):
        if key in self.cache:
            self.cache.move_to_end(key)
        self.cache[key] = value
        if len(self.cache) > self.capacity:
            # 删除最旧的键
            self.cache.popitem(last=False)

cache = LRUCache(2)
cache.put(1, 1)
cache.put(2, 2)
cache.get(1)       # 返回1
cache.put(3, 3)    # 删除键2
cache.get(2)       # 返回-1(已删除)

案例3:数据清洗(过滤无效数据)

data = [
    {"id": 1, "name": "Alice", "age": 25},
    {"id": 2, "name": "Bob", "age": "unknown"},
    {"id": 3, "name": "Charlie"}
]

# 过滤掉age字段非数字的项
clean_data = [item for item in data if isinstance(item.get("age"), int)]
print(clean_data)  # 输出:[{'id': 1, 'name': 'Alice', 'age': 25}]

五、常见问题与解决方案

1. 键不存在时如何避免KeyError?

  • 方法1:get()
value = person.get("gender", "未知")
  • 方法2:try-except
try:
    print(person["gender"])
except KeyError:
    print("键不存在!")

2. 如何遍历字典的键值对?

for key, value in person.items():
    print(f"{key}: {value}")

3. 字典和JSON如何互转?

import json

# 字典转JSON字符串
data = {"name": "张三", "age": 25}
json_str = json.dumps(data)  # 输出:'{"name": "张三", "age": 25}'

# JSON字符串转字典
loaded_data = json.loads(json_str)
print(loaded_data["name"])  # 输出:张三

六、本周练习与答案

练习1:统计单词出现次数

用字典统计字符串"apple banana apple cherry"中各单词的出现次数。
答案

text = "apple banana apple cherry"
counts = {}
for word in text.split():
    counts[word] = counts.get(word, 0) + 1
print(counts)  # 输出:{'apple': 2, 'banana': 1, 'cherry': 1}

练习2:合并多个字典

合并以下三个字典:

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict3 = {"d": 5}

答案

merged = {**dict1, **dict2, **dict3}  # Python 3.5+
# 或 Python 3.9+:merged = dict1 | dict2 | dict3
print(merged)  # 输出:{'a': 1, 'b': 3, 'c': 4, 'd': 5}

练习3:反向查询(值到键)

给定字典{"a": 1, "b": 2},实现通过值查找键(如输入2返回"b")。
答案

reverse_map = {v: k for k, v in original_dict.items()}
print(reverse_map  # 输出:b

七、总结与下一步

  • 核心收获
    • 掌握字典的基础操作(增删改查、键值访问)。
    • 熟悉字典推导式、合并技巧和默认值处理。
    • 能用字典解决实际问题(统计、缓存、数据清洗)。
  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部