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

Python中dict支持多个key的方法

在Python中,字典(dict)是一种非常强大的数据结构,它允许我们通过键(key)来存储和检索值(value)。有时候,我们可能想要根据多个键来检索或操作字典中的数据。虽然Python的字典不直接支持使用多个键进行索引,但我们可以通过一些技巧来实现这一功能。

下面,我将展示几种处理包含多个键的字典的方法,并提供详细的代码示例。

1.方法一:使用元组作为键

我们可以将多个键组合成一个元组,并使用这个元组作为字典的键。

(1)代码示例
# 创建一个字典,使用元组作为键
multi_key_dict = {(1, 'a'): 'value1',(2, 'b'): 'value2',(3, 'c'): 'value3'
}# 检索值
key = (2, 'b')
value = multi_key_dict.get(key)
print(f"The value for key {key} is {value}")# 插入新值
multi_key_dict[(4, 'd')] = 'value4'
print(multi_key_dict)# 更新值
multi_key_dict[(1, 'a')] = 'new_value1'
print(multi_key_dict)
(2)输出
The value for key (2, 'b') is value2
{(1, 'a'): 'new_value1', (2, 'b'): 'value2', (3, 'c'): 'value3', (4, 'd'): 'value4'}
{(1, 'a'): 'new_value1', (2, 'b'): 'value2', (3, 'c'): 'value3', (4, 'd'): 'value4'}

2.方法二:使用嵌套字典

对于更复杂的场景,我们可以使用嵌套字典来组织数据。

(1)代码示例
# 创建一个嵌套字典
nested_dict = {1: {'a': 'value1_a', 'b': 'value1_b'},2: {'a': 'value2_a', 'c': 'value2_c'},3: {'b': 'value3_b', 'c': 'value3_c'}
}# 检索值
primary_key = 2
secondary_key = 'a'
value = nested_dict.get(primary_key, {}).get(secondary_key)
print(f"The value for keys {primary_key} and {secondary_key} is {value}")# 插入新值
primary_key_new = 4
secondary_key_new = 'd'
value_new = 'value4_d'
if primary_key_new not in nested_dict:nested_dict[primary_key_new] = {}
nested_dict[primary_key_new][secondary_key_new] = value_new
print(nested_dict)# 更新值
nested_dict[1]['a'] = 'new_value1_a'
print(nested_dict)
(2)输出
The value for keys 2 and a is value2_a
{1: {'a': 'new_value1_a', 'b': 'value1_b'}, 2: {'a': 'value2_a', 'c': 'value2_c'}, 3: {'b': 'value3_b', 'c': 'value3_c'}, 4: {'d': 'value4_d'}}
{1: {'a': 'new_value1_a', 'b': 'value1_b'}, 2: {'a': 'value2_a', 'c': 'value2_c'}, 3: {'b': 'value3_b', 'c': 'value3_c'}, 4: {'d': 'value4_d'}}

3.方法三:使用collections.defaultdict

对于需要频繁插入新键的场景,collections.defaultdict可以简化代码。

(1)代码示例
from collections import defaultdict# 创建一个嵌套defaultdict
nested_defaultdict = defaultdict(lambda: defaultdict(str))# 插入值
nested_defaultdict[1]['a'] = 'value1_a'
nested_defaultdict[2]['b'] = 'value2_b'
nested_defaultdict[3]['c']['d'] = 'value3_c_d'  # 注意这里我们创建了一个更深层次的嵌套# 检索值
primary_key = 2
secondary_key = 'b'
value = nested_defaultdict[primary_key][secondary_key]
print(f"The value for keys {primary_key} and {secondary_key} is {value}")# 更新值
nested_defaultdict[1]['a'] = 'new_value1_a'
print(nested_defaultdict)
(2)输出
The value for keys 2 and b is value2_b
defaultdict(<function <lambda> at 0x...>, {1: defaultdict(str, {'a': 'new_value1_a'}), 2: defaultdict(str, {'b': 'value2_b'}), 3: defaultdict(str, {'c': defaultdict(str, {'d': 'value3_c_d'})})})

4.实际应用和参考价值

(1)数据存储:在需要存储多维数据或具有多个属性的对象时,这些方法非常有用。

(2)配置管理:可以将配置选项组织成嵌套字典,以便更方便地访问和修改。

(3)缓存:在缓存系统中,可以使用多个键来唯一标识缓存项,从而避免冲突。

5.注意事项

(1)键的唯一性:在方法一中,元组作为键必须是唯一的,否则后面的值会覆盖前面的值。

(2)性能:嵌套字典和defaultdict在检索和插入操作时的性能通常是可以接受的,但在处理大量数据时,可能需要考虑优化。

(3)可读性:使用嵌套结构时,代码的可读性可能会降低,因此建议添加适当的注释来提高代码的可维护性。

6. Python dict支持哪些数据类型作为键

在Python中,dict(字典)是一种非常灵活且强大的数据结构,它允许我们使用键值对(key-value pairs)来存储和检索数据。关于dict支持的键的数据类型,有以下几点需要注意:

(1)支持的数据类型

不可变类型

  • 整数int):包括正整数、负整数和零。例如,{1: 'one', -2: 'two', 0: 'zero'}
  • 浮点数float):虽然可以使用浮点数作为键,但由于浮点数的精度问题,一般不推荐使用。例如,{1.0: 'one', 2.5: 'two point five'}(但需注意精度问题可能导致的键冲突)。
  • 字符串str):这是最常用的键类型之一,字符串可以是任意长度的字符序列。例如,{'apple': 'fruit', 'car': 'vehicle'}
  • 元组tuple):元组是由多个元素组成的有序集合,由于它是不可变的,因此可以用作字典的键。例如,{(1, 2): 'pair', (3, 4, 5): 'triplet'}
  • 布尔值bool):TrueFalse也可以作为键。例如,{True: 'yes', False: 'no'}
  • NoneTypeNone也可以作为键。例如,{None: 'no value'}
  • frozenset:这是一个不可变的集合,因此可以用作键。例如,{frozenset([1, 2]): 'frozen set of 1 and 2'}

不可变类型的自定义对象

  • 如果自定义的类对象实现了__hash__()方法和__eq__()方法,并且它们是不可变的(即对象的状态在创建后不会改变),那么这样的对象也可以用作字典的键。
(2)不支持的数据类型

可变类型:由于字典要求键必须是可哈希的(hashable),而可变类型(如列表、集合、字典本身等)由于其内容可以改变,因此是不可哈希的,不能用作字典的键。

(3)示例代码

以下是一个包含多种类型键的字典示例:

my_dict = {1: 'integer key',-3.14: 'float key',  # 注意:一般不推荐使用浮点数作为键'string': 'string key',(1, 2, 3): 'tuple key',True: 'boolean key',None: 'none key',frozenset([4, 5]): 'frozenset key'
}# 访问字典中的值
print(my_dict[1])         # 输出: integer key
print(my_dict[(1, 2, 3)]) # 输出: tuple key
print(my_dict[True])      # 输出: boolean key# 尝试使用不支持的数据类型作为键(会导致错误)
# my_dict = {[1, 2]: 'list key'}  # TypeError: unhashable type: 'list'
(4)结论

Python的dict支持多种不可变类型作为键,包括整数、浮点数(尽管有精度问题)、字符串、元组、布尔值、NoneTypefrozenset等。然而,它不支持可变类型(如列表、集合、字典等)作为键。了解这些规则有助于我们更有效地使用Python的字典数据结构。

相关文章:

Python中dict支持多个key的方法

在Python中&#xff0c;字典&#xff08;dict&#xff09;是一种非常强大的数据结构&#xff0c;它允许我们通过键&#xff08;key&#xff09;来存储和检索值&#xff08;value&#xff09;。有时候&#xff0c;我们可能想要根据多个键来检索或操作字典中的数据。虽然Python的…...

丹摩 | 基于PyTorch的CIFAR-10图像分类实现

从创建实例开始的新项目流程 第一步&#xff1a;创建实例 登录 DAMODEL 平台。创建一个 GPU 实例&#xff1a; GPU 配置&#xff1a;选择 NVIDIA H800 或其他可用高性能 GPU。 系统配置&#xff1a;推荐使用 Ubuntu 20.04&#xff0c;内存 16GB&#xff0c;硬盘 50GB。 启…...

C#变量和函数如何和unity组件绑定

1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的&#xff0c;应该是直接在GameObject里面填上对应的值 总结&#xff1a; …...

AI模型---安装cuda与cuDNN

1.安装cuda 先打开cmd 输入nvidia-smi 查看显卡支持cuda对应的版本&#xff1a; 然后去英伟达官网下载cuda&#xff08;外网多刷几次&#xff09; https://developer.nvidia.com/cuda-toolkit-archive 注意对应版本 安装过程中如果显示如下图&#xff1a; 请安装visual Stu…...

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…...

内网渗透横向移动1

1.信息收集 &#xff08;1&#xff09;判断域控 shell net time /domain shell ping OWA2010CN-God.god.org &#xff08;2&#xff09;主机探测 浏览探测->网络探测 主机列表显示&#xff1a; &#xff08;3&#xff09;域用户收集&#xff1a; shell net user /domain…...

现代密码学

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…...

Pod 动态分配存储空间实现持久化存储

配置 Pod 以使用 PersistentVolume 作为存储 ​ 关于持久卷的介绍&#xff0c;可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ ​ 持久卷根据存储位置&#xff0c;可以使用本地存储和云存储&#xff0c;如果有云服务平台&#xff0c…...

Jackson、Gson、FastJSON三款JSON利器比拼

在Java领域&#xff0c;有多种JSON工具包&#xff0c;比如Jackson、Gson、FastJSON&#xff0c;每家都各有所长&#xff0c;下面我们从性能、特性、生态、易用 性等几个方面来展开下&#xff1a; 一、Jackson 性能 Jackson是一款高性能的JSON处理库。它在序列化和反序列化操作…...

php:nginx如何配置WebSocket代理?

在nginx配置中加入以下配置即可&#xff1a; server {listen 80;server_name test.com;# 配置 WebSocket 代理location /ws {proxy_pass http://127.0.0.1:8083;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade&qu…...

3349、检测相邻递增子数组 Ⅰ

3349、[简单] 检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k&#xff0c;请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c…...

C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景

C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景 code review! 参考笔记 C++笔记之unique_ptr转移堆内空间的所有权 文章目录 C++笔记之函数入参传递std::unique_ptr 时使用 std::move的场景一.使用 std::unique_ptr 作为函数参数时的主要场景二.一个完整示例一…...

怎么只提取视频中的声音?从视频中提取纯音频技巧

在数字媒体的广泛应用中&#xff0c;提取视频中的声音已成为一项常见且重要的操作。无论是为了学习、娱乐、创作还是法律用途&#xff0c;提取声音都能为我们带来诸多便利。怎么只提取视频中的声音&#xff1f;本文将详细介绍提取声音的原因、工具、方法以及注意事项。 一、为什…...

数仓工具—Hive语法之窗口函数中的 case when

窗口函数中的 case when 今天我们看一下窗口函数和case when 的各种花活,最近的需求各种窗口,一个需求中十几个窗口,加上各种条件边界,所以写了大量的窗口函数和case when的组合,今天我们来看一下。 我们的数据如下 %spark.pyspark df2 = spark.createDataFrame([(&quo…...

基于微信小程序的酒店客房管理系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、员工、普通用户功能模块&#xff1a;员工管理、用户管理、客房管理、预订管理、商品管理、评价管理、续订管理、订单管理等技术选型&#xff1a;SSM&#xff0c;vue&#xff0c;uniapp等测试环境&#xff1a;idea2024&#xff0c;jdk1…...

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f; 100…...

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像&#xff1a;通过双像素可以实现&#xff1a;深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上&#xff0c;也有遮罩等方式的pd生成&#xff0c;如图双像素视图可以看到光圈的不同一半&#x…...

CTF之密码学(Polybius密码)

棋盘密码&#xff0c;也称为Polybius密码或方格密码&#xff0c;是一种基于替换的加密方法。以下是对棋盘密码的详细解析&#xff1a; 一、加密原理 棋盘密码使用一个5x5的方格棋盘&#xff0c;其中填充了26个英文字母&#xff08;通常i和j被视为同一个字母并放在同一个格子中…...

【C++篇】从售票窗口到算法核心:C++队列模拟全解析

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…...

clipboard

clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...