Python:检查是否有任何列表元素是字典中的键

Python:检查是否有任何列表元素是字典中的键,python,list,search,dictionary,Python,List,Search,Dictionary,给定以下代码 all_options = { "1": "/test/1", "2": "/test/2", "3": "/test/3" } selected_options = [ "1", "3" ] 如何从所有_选项中获取条目,其中键与所选_选项中的条目相匹配 我开始使用列表理解,但我被最后一条卡住了: final = () [ final.append(option) for option in all_options if ... ] 多谢各位 [option for optio

给定以下代码

all_options = { "1": "/test/1", "2": "/test/2", "3": "/test/3" }
selected_options = [ "1", "3" ]
如何从所有_选项中获取条目,其中键与所选_选项中的条目相匹配

我开始使用列表理解,但我被最后一条卡住了:

final = ()
[ final.append(option) for option in all_options if ... ]
多谢各位

[option for option in all_options if option in selected_options]
您可能需要设置
所选的
选项
,如果有许多选项,则使用该选项

您可能需要设置一组
所选的
选项
,如果有很多选项,可以使用这些选项。

就像这样

>>> 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开始,您可以使用以下语法:

或者,如果您只需要这些值:

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

>>> 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开始,您可以使用以下语法:

或者,如果您只需要这些值:

>>> [all_options[option] for option in selected_options if option in all_options]
['/test/1', '/test/3']
改为使用
set()
,并且:

以上仅返回键,但NullUserException注意到问题可能也需要该值,使用dict理解:

>>> {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\u options
中查找所需的键

改为使用
set()
,并且:

以上仅返回键,但NullUserException注意到问题可能也需要该值,使用dict理解:

>>> {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\u options
中查找所需的键


我不确定您要返回的确切内容,因此我给出了两个选择:

如果您试图返回:['1','3']

[option for option in all_options if option in selected_options]

如果您试图返回:['/test/1','/test/3']

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

我不确定您要返回的确切内容,因此我给出了两个选择:

如果您试图返回:['1','3']

[option for option in all_options if option in selected_options]

如果您试图返回:['/test/1','/test/3']

[all_options[option] for option in all_options if option in selected_options]
如何从所有_选项中获取条目,其中键与所选_选项中的条目匹配

带着理解力。我们有两种:列表理解和生成器理解

请注意,这取决于“条目”的含义。如果您想要一个具有匹配的键/值对的
dict
,那么您需要一个创建键/值对的理解,然后通过将其馈送到
dict
构造函数来使用它来创建dict

有一个特殊的语法规则,它说如果我们用一个参数调用某个可调用的东西(比如说,类构造函数),并且该参数是生成器理解,那么我们只需要一对括号(而不是两个:一个用于调用函数,另一个用于将理解标记为理解)。这让我们可以写出非常自然的东西

另一方面,如果您只需要键的
列表
,则可以使用列表。(您也可以将生成器理解传递给
列表
构造函数。)

我开始使用列表理解

从根本上说,你对它们如何工作的想法是错误的。你不能用它们来重复执行一个动作;您可以使用它们重复计算结果。您不会在语句的第一部分调用
append
,因为(a)理解已经在为您构建序列,因此没有理由创建另一个要追加的空序列;(b) 执行追加操作后,
append
调用返回
None
,因此您将得到一个None值列表,随后将其丢弃

列表理解创建一个值。生成器也会创建一个值,但它是生成器(因此必须提取其值才能使用它们)

那么,我们如何编写代码呢

键的
列表
如下所示:对于
目录
中的每个键(迭代
目录
迭代其键),我们需要该键(无需修改),前提是该键位于其他
列表
中。也就是说,我们需要
[如果输入选定的\u选项,则输入所有\u选项的键]
。这正是用Python编写它的方式。一种语言在仍然清晰的情况下很难再自然地阅读了

键值对的
dict
如下所示:对于
dict
键值对中的每一个键值对,只有当该键在我们的其他
列表中时,我们才需要该对。我们希望使用这些键值对生成一个
dict
,因此我们将理解封装在
dict
构造函数中。为了从dict中获取键值对,我们迭代它的
.items()
。因此,我们需要一个由键和值构造而成的
dict
,用于原始
dict
项中的每个键和值,其中键位于另一个
列表中。同样,这正是我们所写的:
dict((key,value)for(key,value)in all_options,如果key in selected_options)

在Python的最新版本中,我们还可以使用“dict comprehension”,这基本上是一种语法糖,因此我们可以编写更像列表理解的内容

如何从所有_选项中获取条目,其中键与所选_选项中的条目匹配

带着理解力。我们有两种:列表c