Python:从字典中获取值(对象),其中某个字段匹配特定值(或条件)
我有一个Python字典,这个字典的键是字符串,值是一些对象。
比如说,一个对象里面有一个字符串和一个整数。
class DictItem:
def __init__(self, field1, field2):
self.field1 = str(field1)
self.field2 = int(field2)
还有这个字典:
myDict = dict()
myDict["sampleKey1"] = DictItem("test1", 1)
myDict["sampleKey2"] = DictItem("test2", 2)
myDict["sampleKey3"] = DictItem("test3", 3)
我想知道,哪种方法是获取字典中“field2”字段大于等于2的条目最好的/最有效的方式?
我的想法是创建一个“子字典”(列表也可以),只包含那些field2大于等于2的条目(在这个例子中可能是这样的):
{
"sampleKey2": {
"field1" : "test2",
"field2": 2
},
"sampleKey3": {
"field1" : "test3",
"field2": 3
}
}
有没有比遍历所有字典元素并检查条件更好的方法?比如使用itemgetters和lambda函数?
谢谢!
附注:我正在使用Python2.4,万一这有关系。
5 个回答
3
你应该把各种记录,也就是“DicItem”实例,放在一个列表里。然后可以用生成器或列表表达式轻松筛选出你想要的结果。
data = [
DictItem("test1", 1),
DictItem("test2", 2),
DictItem("test3", 3),
DictItem("test4", 4),
]
接下来:
results = [item for item in data if item.field2 >= 2]
这样做当然是创建了一个线性过滤器。如果你对某些查询的速度要求超过线性速度,那么存放这些记录的容器对象——在这个例子中是一个“列表”,应该是一个专门的类,能够为里面的数据创建索引,就像数据库管理系统(DBMS)为它的表创建索引一样。你可以通过从“列表”派生一个类,并重写“append
”、“insert
”、“__getitem__
”、“__delitem__
”和“pop
”这些方法来轻松实现。
如果你需要为一个高需求的应用程序这样做,我建议你看看一些适用于Python的面向对象数据库系统,比如ZODB等。
4
8
要从你的 dict
创建一个新的 dict
,
subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)