Python - 列表和字典键之间的交集

时间:2012-06-22 14:01:11

标签: python

我有一个如下所示的列表:

l1 = ['200:200', '90:728']

我的字典看起来像这样:

d1 = {'200:200':{'foo':'bar'},'300:300':{'foo':'bar'}}

我需要过滤掉只有键在l1中的词典。字典应如下所示:

result = {'200:200':{'foo':'bar'}}

本质上是一个列表和一个字典的键的交集,同时返回字典的子部分。

如果时间是大型集合的问题,我该如何有效地做到这一点?

谢谢

6 个答案:

答案 0 :(得分:26)

您可以使用以下代码:

keys = set(l1).intersection(set(d1.keys()))
result = {k:d1[k] for k in keys}

编辑:正如评论者建议您可以在Python 2.x中替换第一行:

keys = set(l1).intersection(d1)

在Python 3.x中:

keys = d1.keys() & l1

答案 1 :(得分:4)

在3.x中,这可以很简单:

>>> {k: d1[k] for k in (d1.keys() & l1)}
{'200:200': {'foo': 'bar'}}

在2.7下,您可以使用dict.viewkeys()重新创建此功能:

>>> {k: d1[k] for k in (d1.viewkeys() & l1)}
{'200:200': {'foo': 'bar'}}

在旧版本的2.x中,它有点冗长:

>>> {k: d1[k] for k in (set(d1).intersection(l1))}
{'200:200': {'foo': 'bar'}}

答案 2 :(得分:4)

不确定每个解决方案的性能,但我会这样做:

{k: v for k, v in d1.items() if k in l1}

答案 3 :(得分:0)

您可以在dict构造函数中使用列表推导:

result = dict([(k,d1[k]) for k in l1 if k in d1])

如果您担心删除重复的密钥,请先将l1设为一个集:

result = dict([(k,d1[k]) for k in set(l1) if k in d1])

答案 4 :(得分:0)

定义有效率。不管怎么说,这就是我要做的。如果它太慢我可能会把它移到Cython。

s1 = set(l1)
s2 = set(d1.keys())
s3 = s1 & s2
# now you can access d1 using only keys in s3, or construct a new dict if you like
d2 = dict([(k,d1[k]) for k in s3])

答案 5 :(得分:0)

如果内存分配和释放使得这个过程花费的时间太长,那么就开始拯救。

import itertools
result = {dict_key:d1[dict_key] for dict_key in itertools.ifilter(lambda list_item: list_item in d1, l1) }

这不会为整个新集合分配内存,l1很容易成为迭代器而不是列表。