Python中如何根据部分字典内容反向查找完整字典?

null
Python中如何根据部分字典内容反向查找完整字典?

2 回复
# 根据部分键值对查找完整字典的几种方法

# 原始数据:字典列表
data = [
    {"id": 1, "name": "Alice", "age": 25, "city": "Beijing"},
    {"id": 2, "name": "Bob", "age": 30, "city": "Shanghai"},
    {"id": 3, "name": "Charlie", "age": 25, "city": "Guangzhou"}
]

# 方法1:列表推导式(最简单直接)
def find_dicts_simple(data, partial_dict):
    """根据部分键值对查找所有匹配的完整字典"""
    return [d for d in data 
            if all(d.get(k) == v for k, v in partial_dict.items())]

# 方法2:使用filter函数(函数式编程风格)
def find_dicts_filter(data, partial_dict):
    """使用filter函数进行查找"""
    return list(filter(
        lambda d: all(d.get(k) == v for k, v in partial_dict.items()),
        data
    ))

# 方法3:构建查找索引(适合多次查询)
class DictLookup:
    def __init__(self, data):
        """预处理数据,为每个键值对建立反向索引"""
        self.index = {}
        for item in data:
            for key, value in item.items():
                self.index.setdefault(key, {}).setdefault(value, []).append(item)
    
    def find(self, partial_dict):
        """根据部分键值对查找,返回交集"""
        results = None
        for key, value in partial_dict.items():
            if key in self.index and value in self.index[key]:
                current = set(self.index[key][value])
                results = current if results is None else results & current
            else:
                return []
        return list(results) if results else []

# 使用示例
if __name__ == "__main__":
    # 查找年龄为25的所有人
    partial = {"age": 25}
    print("方法1结果:", find_dicts_simple(data, partial))
    
    # 查找年龄25且在北京的人
    partial2 = {"age": 25, "city": "Beijing"}
    print("方法2结果:", find_dicts_filter(data, partial2))
    
    # 使用索引查找(适合大数据集)
    lookup = DictLookup(data)
    print("方法3结果:", lookup.find({"name": "Alice"}))

# 选择建议:小数据用方法1,大数据且频繁查询用方法3。

简单说就是:小数据用列表推导,大数据建索引。


请楼主使用人类易于理解的语言。

回到顶部