Python字典以元组为键时,能否仅匹配元组单个元素查询对应值?
元组类型键的字典单元素匹配查询方案
前提说明
你给出的示例字典如下(注意不要使用dict作为变量名,会覆盖Python内置字典类,示例中替换为dict_var):
# 示例中a、b为你代码中已提前定义的变量 dict_var = {(a,2019): 6, (a,2020): 7 , (a,2021):8, (a,2022):9, (b,2020):8, (b,2021):10}
需求为查询所有键的第一个元素等于a的对应值,输出结果为[6,7,8,9]。
实现方法
方法1:列表推导式直接遍历(适用于单次查询、数据量不大的场景)
直接遍历字典的所有键值对,匹配元组第一个元素即可,代码最简单:
result = [value for key, value in dict_var.items() if key[0] == a]
该方法时间复杂度为O(n),n为字典的键值对总数,足够应对绝大多数普通场景。如果需要保证结果按年份升序排列,可增加排序逻辑:
# 按元组键的第二个元素(年份)升序排序后取值 result = [val for key, val in sorted(dict_var.items(), key=lambda x: x[0][1]) if key[0] == a]
方法2:提前构建二级索引(适用于多次查询、数据量较大的场景)
如果需要频繁按元组的第一个元素查询,可提前构建二级索引,后续查询时间复杂度为O(1):
# 构建索引,外层键为元组第一个元素,内层为年份到值的映射 index = {} for (key1, key2), value in dict_var.items(): index.setdefault(key1, {})[key2] = value # 后续直接查询即可 result = list(index[a].values()) # 需按年份排序的话可调整为: # result = [val for year, val in sorted(index[a].items())]
方法3:封装通用查询函数(适用于需要灵活匹配规则的场景)
如果需要支持更多匹配规则,比如同时匹配元组的两个元素、按规则过滤第二个元素,可封装通用查询函数:
def query_tuple_dict(target_dict, match_key1=None, match_key2=None): result = [] for (k1, k2), val in target_dict.items(): # 传入匹配规则才校验,不传则匹配所有 if match_key1 is not None and k1 != match_key1: continue if match_key2 is not None and k2 != match_key2: continue result.append(val) return result # 调用示例:仅匹配第一个元素为a result = query_tuple_dict(dict_var, match_key1=a) # 其他调用示例:匹配第二个元素为2021的所有值 # result = query_tuple_dict(dict_var, match_key2=2021)
内容的提问来源于stack exchange,提问作者park luna
相关产品推荐
相关产品推荐

