如何过滤字典以仅包含给定列表中的键?

12

我对Python和stackoverflow都非常陌生。感谢您的耐心和帮助。

我想根据一个列表的内容来过滤一个字典,就像这样:

d={'d1':1, 'd2':2, 'd3':3}

f = ['d1', 'd3']

r = {items of d where the key is in f}

这种写法是否可行?如果不是,正确的语法应该是什么?

谢谢您的帮助。

Vincent


你能假设元素都在那里吗? - Karoly Horvath
如果f是['d1', 'd3', 'd99'],那么期望的结果是什么? - PaulMcG
Superset: https://dev59.com/ynE85IYBdhLWcg3wUBkZ超集:https://dev59.com/ynE85IYBdhLWcg3wUBkZ - Ciro Santilli OurBigBook.com
2个回答

22

假设你想创建一个新的字典(无论出于什么原因):

d = {'d1':1, 'd2':2, 'd3':3}
keys = ['d1', 'd3']

filtered_d = dict((k, d[k]) for k in keys if k in d)
# or: filtered_d = dict((k, d[k]) for k in keys)
# if every key in the list exists in the dictionary

1
字典推导式语法?Python 2.7和3.x -- 更加整洁! - Katriel
@Felix Kling 我已经尝试过这个方法,用于一个字典 d,该字典的值是列表,并返回了一个空的字典。请问如何修改这几行代码呢? - FaCoffee
@FrancescoCastellani:字典中有哪些值并不重要:http://codepad.org/PyIJrdJF - Felix Kling
你认为这个比下面这段代码快吗: for k in keys: filtered_d[k]=d[k]? - FaCoffee
@FrancescoCastellani:不知道。你可以自己测试一下时间 :) - Felix Kling
3
这段文本是Python代码,意思是通过字典解析(dict comprehension)来过滤一个字典d,只保留键为d中已有的键的键值对,生成一个新的字典filtered_d。 - RubenLaguna

5

您可以使用列表推导式遍历列表,并在字典中查找键,例如:

aa = [d[k] for k in f]

这是一个运行示例。
>>> d = {'k1': 1, 'k2': 2, 'k3' :3}
>>> f = ['k1', 'k2']
>>> aa = [d[k] for k in f]
>>> aa
[1, 2]

如果您想从结果重建一个字典,可以将键也捕获到元组列表中并转换为字典,例如:

aa = dict ([(k, d[k]) for k in f])

Python的更新版本(特别是2.7、3)具有一种名为字典推导的功能,可以一次性完成所有操作。更深入地讨论可以点击这里。


非常相似,而且对我来说非常完美,因为我不需要检查键的存在。非常感谢。 - Vincent
假设f的所有元素都在d中。 - PaulMcG
是的,如果字典中没有某个内容,它就会崩溃。另一篇帖子上的评论之一展示了使用 d.get(key) 绕过这个问题的方法。 - ConcernedOfTunbridgeWells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接