我有一个字典,里面有一大堆词条。我只对其中的几个感兴趣。有什么简单的方法可以把其他的都剪掉吗?


当前回答

根据德尔南的回答。

如果你想要的钥匙不在旧字典里怎么办?delnan解决方案将抛出一个您可以捕获的KeyError异常。如果这不是你需要的,也许你想:

只包含同时存在于old_dict和你的wanted_keys集合中的键。 old_dict = {'name':"Foobar", 'baz':42} Wanted_keys = ['name', 'age'] New_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())} > > > new_dict {“名称”:“Foobar”} 对于old_dict中未设置的键具有默认值。 default =无 New_dict = {k: old_dict[k]如果k在old_dict否则默认k在wanted_keys} > > > new_dict {'age': None, 'name': 'Foobar'}

其他回答

根据德尔南的回答。

如果你想要的钥匙不在旧字典里怎么办?delnan解决方案将抛出一个您可以捕获的KeyError异常。如果这不是你需要的,也许你想:

只包含同时存在于old_dict和你的wanted_keys集合中的键。 old_dict = {'name':"Foobar", 'baz':42} Wanted_keys = ['name', 'age'] New_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())} > > > new_dict {“名称”:“Foobar”} 对于old_dict中未设置的键具有默认值。 default =无 New_dict = {k: old_dict[k]如果k在old_dict否则默认k在wanted_keys} > > > new_dict {'age': None, 'name': 'Foobar'}

给定你的原始字典orig和你感兴趣的键的条目集:

filtered = dict(zip(keys, [orig[k] for k in keys]))

这并不像delnan的答案那么好,但应该适用于每个感兴趣的Python版本。然而,它对原始字典中存在的每个键元素都是脆弱的。

如果给定字典中没有一个过滤器键,则接受的答案抛出KeyError。

要获得给定字典的副本,只包含允许键中的一些键,一种方法是检查该键是否确实存在于字典推导中给定的字典中:

filtered_dict = { k: old_dict[k] for k in allowed_keys if k in old_dict }

这不会影响性能,因为对字典的查找具有恒定的运行时复杂性。

或者,您可以使用old_dict。获取(k, some_default)来填充缺失的项。

这是我的方法,支持嵌套字段,如mongo查询。

使用方法:

>>> obj = { "a":1, "b":{"c":2,"d":3}}
>>> only(obj,["a","b.c"])
{'a': 1, 'b': {'c': 2}}

只有函数:

def only(object,keys):
    obj = {}
    for path in keys:
        paths = path.split(".")
        rec=''
        origin = object
        target = obj
        for key in paths:
            rec += key
            if key in target:
                target = target[key]
                origin = origin[key]
                rec += '.'
                continue
            if key in origin:
                if rec == path:
                    target[key] = origin[key]
                else:
                    target[key] = {}
                target = target[key]
                origin = origin[key]
                rec += '.'
            else:
                target[key] = None
                break
    return obj

这个函数可以做到:

def include_keys(dictionary, keys):
    """Filters a dict by only including certain keys."""
    key_set = set(keys) & set(dictionary.keys())
    return {key: dictionary[key] for key in key_set}

就像delnan的版本一样,这个版本使用字典理解,并且对于大型字典具有稳定的性能(仅取决于您允许的键数,而不是字典中的键总数)。

就像MyGGan的版本一样,这个版本允许您的键列表包含字典中可能不存在的键。

作为奖励,这里是反向的,在这里你可以通过排除原始的某些键来创建字典:

def exclude_keys(dictionary, keys):
    """Filters a dict by excluding certain keys."""
    key_set = set(dictionary.keys()) - set(keys)
    return {key: dictionary[key] for key in key_set}

注意,与delnan版本不同的是,该操作不是在适当的位置完成的,因此性能与字典中的键数有关。但是,这样做的好处是该函数不会修改所提供的字典。

编辑:添加了一个单独的功能,用于从字典中排除某些键。