我有一个字典,里面有一大堆词条。我只对其中的几个感兴趣。有什么简单的方法可以把其他的都剪掉吗?
当前回答
这是我的方法,支持嵌套字段,如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
其他回答
你可以用我的函数库中的项目函数来做:
from funcy import project
small_dict = project(big_dict, keys)
还要看一下select_keys。
略为优雅的词典理解:
foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}
这一行lambda应该工作:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
这里有一个例子:
my_dict = {"a":1,"b":2,"c":3,"d":4}
wanted_keys = ("c","d")
# run it
In [10]: dictfilt(my_dict, wanted_keys)
Out[10]: {'c': 3, 'd': 4}
它是一个基本的列表推导式,遍历你的dict键(i in x),如果键位于你想要的键列表(y)中,则输出一个元组(键,值)对列表。dict()将整个内容包装成dict对象输出。
如果你事先知道否定集(也不是键):
v = {'a': 'foo', 'b': 'bar', 'command': 'fizz', 'host': 'buzz' }
args = {k: v[k] for k in v if k not in ["a", "b"]}
args # {'command': 'fizz', 'host': 'buzz'}
简式:
[s.pop(k) for k in list(s.keys()) if k not in keep]
正如大多数答案所建议的那样,为了保持简洁,我们必须创建一个重复的对象,无论是list还是dict。这个函数创建了一个丢弃列表,但删除了原始字典中的键。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录