写点什么

Python 中 dict 支持多个 key 的方法

  • 2025-01-23
    福建
  • 本文字数:2848 字

    阅读完需:约 9 分钟

在 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 = 2secondary_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 = 4secondary_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_newprint(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 # 创建一个嵌套defaultdictnested_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 = 2secondary_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_bdefaultdict(<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 keyprint(my_dict[(1, 2, 3)]) # 输出: tuple keyprint(my_dict[True])      # 输出: boolean key # 尝试使用不支持的数据类型作为键(会导致错误)# my_dict = {[1, 2]: 'list key'}  # TypeError: unhashable type: 'list'
复制代码


(4)结论


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


文章转载自:TechSynapse

原文链接:https://www.cnblogs.com/TS86/p/18565965

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Python中dict支持多个key的方法_Python_快乐非自愿限量之名_InfoQ写作社区