如何从 all_options 中获取与 selected_options 中的条目匹配的键?使用推导式。我们有两种:列表推导式和生成器推导式。
请注意,这取决于您对“条目”的理解。如果您想要一个与之匹配的键/值对的 dict,则需要创建一个推导式来创建键/值对,然后将其提供给 dict 构造函数以创建 dict。
有一条特殊的语法规则,即如果我们仅使用一个参数(例如类构造函数)调用可调用对象,并且该参数是生成器推导式,则我们只需要一对括号(而不是两个:一个用于调用函数,另一个用于标记推导式为推导式)。这使我们可以编写非常自然的代码。
另一方面,如果您只想要一个键的列表,则可以使用列表推导式。(您也可以将生成器推导式传递给 list 构造函数。)
我开始使用列表推导式的方法...
你从根本上对它们的工作原理有误解。你不是用它们重复执行一个动作,而是用它们重复计算结果。你不会在语句的第一部分中进行append
调用,因为:(a)列表推导式已经在为你构建序列,所以没有理由创建另一个空序列去附加;(b)append
调用在执行附加后返回None
,因此最终你会得到一个只包含None
值的列表,随后可以抛弃。
列表推导式创建一个值。生成器推导式也创建一个值,但它是一个生成器(因此您必须提取其值才能使用)。
那么,我们该如何编写代码呢?
一个键的
list
看起来像这样:对于字典中的每个键(在字典上迭代会迭代它的键),我们只想要那个键(没有修改),仅当该键在我们的另一个
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”,它基本上是一种语法糖,使我们可以编写类似于列表推导式的东西。
final = [...]
即可。 - John La Rooy