来自ordereddict的子集字段?

Exi*_*xie 3 python ordereddictionary

所以,我有一个有序的字典,它有一堆键/值对。我可以使用 items() 方法提取所有它们。但是如果我只想选择其中的一些呢?

>>> import collections
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2})
>>> d.items()
[('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]
Run Code Online (Sandbox Code Playgroud)

如果我只想要苹果和香蕉怎么办?

有没有办法可以指定我想要的键?

>>> d['apple','banana'] <-- does not work
Run Code Online (Sandbox Code Playgroud)

我正在考虑在最后使用列表理解来过滤结果,但看起来很混乱,我希望有更好的方法。

mar*_*eau 5

你可以定义一个单线来做到这一点:

>>> import collections
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2})
>>> d.items()
[('orange', 2), ('pear', 1), ('banana', 3), ('apple', 4)]
>>>
>>> subset = lambda d, *keys: [(key, d[key]) for key in keys]
>>> subset(d, 'apple', 'banana')
[('apple', 4), ('banana', 3)]
Run Code Online (Sandbox Code Playgroud)

作为奖励,它也适用于常规dict对象。

更新

要以与 相同的顺序获得结果列表OrderedDict,正如@Maxim Veksler 似乎认为您可能想要的那样,必须以给定特定顺序的方式定义有序字典。在 3.6 之前的 Python 版本中,必须执行以下操作,而不是您的问题:

d = collections.OrderedDict([('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2)])
Run Code Online (Sandbox Code Playgroud)

list它将一个参数传递给构造函数而不是一个常规的dict.

因此,假设已完成(或者如果您使用的是 Python 3.6+ 则未完成),您可以subset()像这样定义函数:

subset = lambda d, *keys: [(key, d[key]) for key in d.keys() if key in set(keys)]
Run Code Online (Sandbox Code Playgroud)

给定正确创建的样本OrderedDict输入,这将返回此结果:

>>> subset(d, 'apple', 'banana')
[('banana', 3), ('apple', 4)]
Run Code Online (Sandbox Code Playgroud)

请注意,返回的列表中的对现在与键在OrderedDict.