给出以下代码
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 ... ]
谢谢
答案 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]