Python:检查任意列表元素是否为字典的键

4 投票
5 回答
9746 浏览
提问于 2025-04-17 00:18

给定以下代码

all_options = { "1": "/test/1", "2": "/test/2", "3": "/test/3" }
selected_options = [ "1", "3" ]

我该如何从all_options中获取那些键与selected_options中的某个条目匹配的内容呢?

我开始尝试使用列表推导式,但在最后一个条件上遇到了困难:

final = ()
[ final.append(option) for option in all_options if ... ]

谢谢你

5 个回答

1

使用 set() 来代替,并且可以利用 交集操作

>>> final = set(all_options.keys()) & set(selected_options)
>>> print(final)
{'1', '3'}

上面的代码只返回了键,但 NullUserException 提到问题可能也想要值,可以使用字典推导式:

>>> {x: all_options[x] for x in set(all_options.keys()) & set(selected_options)}
{'1': '/test/1', '3': '/test/3'}

为了完整性,这里是 仅仅 值的部分:

>>> [all_options[x] for x in set(all_options.keys()) & set(select_options)]
['/test/1', '/test/3']

下面的做法是错误的。使用 set() 会遍历两个列表,而不是只遍历一个。

如果选项变得很大,使用集合会更好。条件列表推导式会检查其中一个容器里的每一个项目,但集合交集利用了 Python 出色的哈希功能。即使是这里的列表推导式,也只是查找 all_options 中所需的键。

1
[option for option in all_options if option in selected_options]

如果你有很多选项,可以考虑把这些选项放到一个叫做 set 的东西里,使用这个 set 来处理 selected_options,这样会更方便。

6

就像这样吗?

>>> dict((option, all_options[option]) for option in selected_options if option in all_options)
{'1': '/test/1', '3': '/test/3'}

从Python 2.7和3版本开始,你可以使用一种叫做字典推导式的写法:

{option : all_options[option] for option in selected_options if option in all_options}

或者如果你只想要值的话:

>>> [all_options[option] for option in selected_options if option in all_options]
['/test/1', '/test/3']

撰写回答