Python ordereddict中的子集字段?

Python ordereddict中的子集字段?,python,ordereddictionary,Python,Ordereddictionary,因此,我有一个有序字典,它有一堆键/值对。我可以使用items()方法提取所有这些内容。但是如果我只想选择其中的一些呢 >>> import collections >>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2}) >>> d.items() [('apple', 4), ('banana', 3), ('orange', 2),

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

>>> import collections
>>> d = collections.OrderedDict({'banana': 3, 'apple': 4, 'pear': 1,'orange': 2})
>>> d.items()
[('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]
如果我只想要苹果和香蕉呢

有没有办法指定我想要的密钥

>>> d['apple','banana'] <-- does not work

>>d['apple','banana']我不知道有什么方法存在,但如果您发现自己在整个代码库中都必须这样做,那么创建一个通用方法可能是值得的。也许像

>>> specific_dict_items = lambda d, l: [(key, d.get(key, '')) for key in l]
>>> specific_dict_items({1:1, 2:2, 3:3, 4:4, 5:5}, [1, 3, 5, 7])
[(1, 1), (3, 3), (5, 5), (7, '')]

您可以定义一个单行程序来执行此操作:

>>> 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)]
作为奖励,它还适用于常规的
dict
对象

更新

要按照@Maxim Veksler认为您可能需要的顺序获得与
OrderedDict
相同的结果列表,必须以特定顺序定义有序字典。在3.6之前的Python版本中,必须执行类似的操作,而不是您的问题:

d = collections.OrderedDict([('banana', 3), ('apple', 4), ('pear', 1), ('orange', 2)])
它将
列表
参数传递给构造函数,而不是常规的
dict

因此,假设这已经完成(如果您使用的是Python 3.6+,那么您可以这样定义
subset()
函数:

subset = lambda d, *keys: [(key, d[key]) for key in d.keys() if key in set(keys)]
>>> from multorddict import MultOrderedDict
>>> mod = MultOrderedDict(banana=3, apple=4, pear=1, orange=2)
>>> mod.items()
[('orange', 2), ('pear', 1), ('apple', 4), ('banana', 3)]
>>> mod.items('apple','banana')
[('apple', 4), ('banana', 3)]
>>> 
给定正确创建的样本
OrderedDict
输入,它将返回此结果:

>>> subset(d, 'apple', 'banana')
[('banana', 3), ('apple', 4)]

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

中的顺序相同。您很可能会以这样或那样的方式使用列表理解。下面是一种在方法实现中隐藏列表理解的方法:

from collections import OrderedDict

class MultOrderedDict(OrderedDict):
    def items(self, *items):
        all = super(MultOrderedDict, self).items()
        if not items:
            return all
        return type(self)((key, value) for (key, value) in all if key in items).items()
使用该类定义(假设它位于
multorddict.py
)可以执行以下操作:

subset = lambda d, *keys: [(key, d[key]) for key in d.keys() if key in set(keys)]
>>> from multorddict import MultOrderedDict
>>> mod = MultOrderedDict(banana=3, apple=4, pear=1, orange=2)
>>> mod.items()
[('orange', 2), ('pear', 1), ('apple', 4), ('banana', 3)]
>>> mod.items('apple','banana')
[('apple', 4), ('banana', 3)]
>>> 

此方法更改了
items
方法的语义,这可能不是一件好事。

您希望
d['apple','banana']
生成什么?元组或键/值对列表,与.items()相同。这不会返回元组或键/值对列表,与
items()
相同。当执行
mod['apple','banana']
时,它也会无限递归。同意,我没有在python2中测试我的初始实现(在python3中它没有相同的问题)。如果答案没有被接受,我会删除它,但我重新编写了它以覆盖
,而不是
\uu getitem\uuuu
。最终,熟悉列表理解并直接使用它们会更有意义。OrderedDict要保留的键的顺序不会丢失吗?@Maxim:OP在问题中没有提到保持原始
OrderDict
顺序的结果。看看他们对我在评论中提出的关于他们想要什么结果的回答。