当前位置: 首页 > news >正文

Python及C++中的字典


一、Python中的字典

(一)基本概念

  • 字典(dict是Python中一种可变容器模型,用于存储键值对(key:value)。字典的键必须是不可变类型(如字符串、数字或元组),而值可以是任意类型。
  • 字典的特点:
    • 键是唯一的。
    • 无序(在Python 3.7之前是无序的,3.7及以后版本在实现上保持了插入顺序,但不应依赖此特性进行有序操作)。
    • 基于哈希表实现,查找、插入和删除操作的平均时间复杂度为O(1)

(二)创建字典

  1. 直接使用花括号创建

    empty_dict = {}  # 创建一个空字典
    my_dict = {"name": "Alice", "age": 25, "is_student": False}
    
  2. 使用dict函数创建

    • 通过键值对列表创建:
      dict_from_pairs = dict([("key1", "value1"), ("key2", "value2")])
      
    • 通过关键字参数创建:
      dict_from_kwargs = dict(key1="value1", key2="value2")
      

(三)访问和操作字典

  1. 访问元素

    • 使用dict[key]访问值:
      print(my_dict["name"])  # 输出Alice
      
      如果键不存在,会抛出KeyError异常。
    • 使用get()方法访问值:
      print(my_dict.get("age"))  # 输出25
      print(my_dict.get("gender", "Unknown"))  # 输出Unknown,因为gender键不存在
      
  2. 添加和修改元素

    • 添加键值对:
      my_dict["gender"] = "Female"
      
    • 修改键值对:
      my_dict["age"] = 26
      
  3. 删除元素

    • 使用del语句删除键值对:
      del my_dict["is_student"]
      
    • 使用pop()方法删除键值对并返回值:
      value = my_dict.pop("age", None)  # 删除age键,并将对应的值赋给value
      
    • 使用clear()方法清空字典:
      my_dict.clear()
      
  4. 检查键是否存在

    • 使用in关键字:
      if "name" in my_dict:
          print("Key exists")
      

(四)遍历字典

  1. 遍历键

    for key in my_dict:
        print(key)
    
  2. 遍历值

    for value in my_dict.values():
        print(value)
    
  3. 同时遍历键和值

    for key, value in my_dict.items():
        print(key, value)
    

二、C++中的std::map

(一)基本概念

  • std::map是C++标准模板库(STL)中的一种关联容器,用于存储键值对。它基于红黑树实现,保证了键的唯一性。
  • 特点:
    • 键是唯一的。
    • 有序,键会按照升序排列。
    • 查找、插入和删除操作的时间复杂度为O(log n)

(二)创建std::map

  1. 直接初始化

    #include <map>
    #include <iostream>
    using namespace std;
    
    int main() {
        map<int, string> my_map = {{1, "Alice"}, {2, "Bob"}};
        return 0;
    }
    
  2. 使用insert()方法

    my_map.insert(pair<int, string>(3, "Charlie"));
    

(三)访问和操作std::map

  1. 访问元素

    • 使用operator[]访问值:
      cout << my_map[1] << endl;  // 输出Alice
      
      如果键不存在,operator[]会自动插入一个默认构造的值。
    • 使用at()方法访问值:
      cout << my_map.at(2) << endl;  // 输出Bob
      
      如果键不存在,at()会抛出std::out_of_range异常。
  2. 添加和修改元素

    • 添加键值对:
      my_map[3] = "Charlie";
      
    • 修改键值对:
      my_map[1] = "Alice Updated";
      
  3. 删除元素

    • 使用erase()方法删除键值对:
      my_map.erase(1);
      
    • 使用clear()方法清空整个map
      my_map.clear();
      
  4. 检查键是否存在

    • 使用find()方法:
      if (my_map.find(2) != my_map.end()) {
          cout << "Key exists" << endl;
      }
      

(四)遍历std::map

  1. 使用迭代器遍历

    for (auto it = my_map.begin(); it != my_map.end(); ++it) {
        cout << it->first << " " << it->second << endl;
    }
    
  2. 使用C++11范围for循环

    for (const auto& pair : my_map) {
        cout << pair.first << " " << pair.second << endl;
    }
    

三、C++中的std::unordered_map

(一)基本概念

  • std::unordered_map也是C++标准模板库(STL)中的一种关联容器,用于存储键值对。它基于哈希表实现,保证了键的唯一性。
  • 特点:
    • 键是唯一的。
    • 无序,键值对的存储顺序是随机的。
    • 查找、插入和删除操作的平均时间复杂度为O(1)

(二)创建std::unordered_map

  1. 直接初始化

    #include <unordered_map>
    #include <iostream>
    using namespace std;
    
    int main() {
        unordered_map<int, string> my_umap = {{1, "Alice"}, {2, "Bob"}};
        return 0;
    }
    
  2. 使用insert()方法

    my_umap.insert(pair<int, string>(3, "Charlie"));
    

(三)访问和操作std::unordered_map

  1. 访问元素

    • 使用operator[]访问值:
      cout << my_umap[1] << endl;  // 输出Alice
      
      如果键不存在,operator[]会自动插入一个默认构造的值。
    • 使用at()方法访问值:
      cout << my_umap.at(2) << endl;  // 输出Bob
      
      如果键不存在,at()会抛出std::out_of_range异常。
  2. 添加和修改元素

    • 添加键值对:
      my_umap[3] = "Charlie";
      
    • 修改键值对:
      my_umap[1] = "Alice Updated";
      
  3. 删除元素

    • 使用erase()方法删除键值对:
      my_umap.erase(1);
      
    • 使用clear()方法清空整个unordered_map
      my_umap.clear();
      
  4. 检查键是否存在

    • 使用find()方法:
      if (my_umap.find(2) != my_umap.end()) {
          cout << "Key exists" << endl;
      }
      

(四)遍历std::unordered_map

  1. 使用迭代器遍历

    for (auto it = my_umap.begin(); it != my_umap.end(); ++it) {
        cout << it->first << " " << it->second << endl;
    }
    
  2. 使用C++11范围for循环

    for (const auto& pair : my_umap) {
        cout << pair.first << " " << pair.second << endl;
    }
    

http://www.dtcms.com/a/129056.html

相关文章:

  • 【玩泰山派】5、点灯,驱动led-(2)ubuntu18.04 升级python3.6到python3.7,安装pip3
  • 20250408在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时拿掉经常出现的list-iodomain.sh警告信息
  • 58-使用wordpress快速创建个人网站
  • Go小技巧易错点100例(二十六)
  • SpringBoot项目:部门管理系统
  • 防爆平板:石油化工厂智慧转型的“中枢神经”
  • BANK OF CHINA(HONG KONG)网点
  • Spring Bean 的生命周期
  • Tiny Cluster(1)——搭建树莓派小型计算集群
  • 【C++初学】C++核心编程技术详解(三):多态与文件操作
  • 重构艺术 | 如何优雅地“提炼函数“
  • 并查集(Java模板及优化点解析)
  • Java IO精讲:从传统IO到NIO的深度探索
  • Selenium之Actions事件
  • 达梦数据库-学习-18-ODBC数据源配置(Linux)
  • CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)
  • java常见线程安全实现方案
  • 05-RabbitMQ 面试题-mk
  • 电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》
  • Python 嵌套结构的defaultdict介绍
  • 训练模型的方式的两种方式:图像描述(Image Captioning)和对比学习(Contrastive Learning)原理及区别
  • 关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例
  • 【25软考网工笔记】第二章 数据通信基础(2) 信道延迟计算
  • python利用open-cv和SSIM和特征值比较两个图片的相似性
  • JAVAEE(多线程)
  • 公路水运安全员,yyds!
  • (打卡)794. 高精度除法
  • js 效果展示 拿去练手
  • 大模型入门
  • Redis:线程模型