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

Tam*_*mpa 16 python

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

l1 = ['200:200', '90:728']
Run Code Online (Sandbox Code Playgroud)

我有一个字典,看起来像这样:

d1 = {'200:200':{'foo':'bar'},'300:300':{'foo':'bar'}}
Run Code Online (Sandbox Code Playgroud)

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

result = {'200:200':{'foo':'bar'}}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

JPv*_*rwe 26

您可以使用以下代码:

keys = set(l1).intersection(set(d1.keys()))
result = {k:d1[k] for k in keys}
Run Code Online (Sandbox Code Playgroud)

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

keys = set(l1).intersection(d1)
Run Code Online (Sandbox Code Playgroud)

在Python 3.x中:

keys = d1.keys() & l1
Run Code Online (Sandbox Code Playgroud)

  • 甚至不需要键(),`set(l1).intersection(d1)` (4认同)
  • 请注意,在 3.x 中,字典视图类似于 set,因此您不需要将其包装在 `set()` 中。事实上,在 3.x 中,整个顶行可以是 `keys = d1.keys() & l1`。 (2认同)

Gar*_*tty 5

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

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

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

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

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

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


ice*_*ime 5

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

{k: v for k, v in d1.items() if k in l1}
Run Code Online (Sandbox Code Playgroud)

  • 即使l1的成员不是d1中的键(许多其他键都将失败)时,这也将起作用。 (2认同)