Python:检查任意列表元素是否为字典的键
给定以下代码
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']