How do I get the entries from all_options where the key matches an entry in selected_options?

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

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

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

另一方面,如果您只需要一个list的键,那么您可以使用列表理解。(您也可以将生成器理解传递给list构造函数。)I started down the path of using a List Comprehension...

从根本上说,你对它们的工作方式有错误的想法。你不需要反复使用它们来执行一个动作;你可以反复使用它们来计算一个结果。您不会在语句的第一部分进行append调用,因为(a)理解已经在为您构建序列,因此没有理由创建另一个要附加到的空序列;(b)执行附加操作后,append调用返回None,所以你最终得到了一个没有值的列表,然后你就扔掉了。

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

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

一个键的list看起来是这样的:对于dict(遍历一个dict遍历它的键)中的每一个键,我们想要那个键(不需要修改),只要该键在另一个list中。也就是说,我们想要[key for key in all_options if key in selected_options]。这正是用Python编写它的方式。一种语言在不模棱两可的情况下很难再自然地阅读。

键值对的dict如下所示:对于dict的键值对中的每个键值对,我们需要该对,仅当该键位于另一个list中时。我们希望使用这些键值对生成一个dict,因此我们将理解包装在dict构造函数中。为了从dict中获取键值对,我们遍历它的.items()。因此,我们希望根据键和值构造一个dict,用于原始dict项中的每个键和值,其中键位于另一个list。再说一遍,这正是我们写的:dict((key, value) for (key, value) in all_options if key in selected_options)。

在较新版本的Python中,我们还可以使用“dict comprehension”,它基本上是语法糖,这样我们就可以编写更像列表理解的内容。