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

时间:2011-08-25 00:32:19

标签: python list search dictionary

给出以下代码

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 个答案:

答案 0 :(得分:5)

就像这样?

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

{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']

答案 1 :(得分:1)

[option for option in all_options if option in selected_options]

您可能需要制作set selected_options,如果有很多,请使用它。

答案 2 :(得分:1)

改为使用set()take advantage of the intersection operation

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

以上只返回键,但NullUserException指出问题也可能需要该值,使用dict comprehention:

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

答案 3 :(得分:1)

  

如何从密钥与selected_options中的条目匹配的all_options中获取条目?

理解。我们有两种:列表推导和生成器理解。

请注意,这取决于“条目”的含义。如果你想要一个匹配的键/值对的dict,那么你需要一个能够创建键/值对的理解,然后通过将它提供给{{1}来创建一个dict来创建一个dict。构造函数。

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

另一方面,如果您只想要dict个键,那么您可以使用列表推导。 (您也可以将生成器理解传递给list构造函数。)

  

我开始使用列表理解......

从根本上说,你对他们的工作方式有错误的想法。你不要用它们来反复执行动作;你用它们来反复计算一个结果。你不会在语句的第一部分进行list调用,因为(a)理解已经为你构建了序列,因此没有理由创建另一个空序列来追加; (b)append调用在执行追加后返回append,因此最终会得到一个随后丢弃的无值列表。

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

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

None个密钥如下所示:对于list中的每个密钥(迭代dict迭代其密钥),我们希望密钥(无需修改),仅当密钥位于我们的其他dict时。也就是说,我们想要list。而这正是你用Python编写的。一种语言几乎不能自然地阅读,同时仍然是明确的。

[key for key in all_options if key in selected_options]个键值对看起来像这样:对于dict的键值对中的每个键值对,只有当键在我们的键中时,我们才需要该对其他dict。我们想使用这些键值对创建list,因此我们将理解包装在dict构造函数中。为了从dict获取键值对,我们迭代它的dict。因此,对于原始.items()项中的每个键和值,我们需要根据键和值构建dict,其中键位于另一个dict中。而且,这正是我们写的:list

在最新版本的Python中,我们也可以使用“dict comprehension”,它基本上是语法糖,因此我们可以编写看起来更像列表理解的东西。

答案 4 :(得分:0)

我不确定你要回归的确切内容,所以我给出了几个选择:

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

[option for option in all_options if option in selected_options]

OR

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

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