Python:从一个对象字段中的某个字段与某个值(或条件)匹配的对象字典中获取值(对象)
我有一个Python字典,其键是字符串,值是对象。Python:从一个对象字段中的某个字段与某个值(或条件)匹配的对象字典中获取值(对象)
例如,一个字符串和一个INT
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“field> = 2?
的想法是创建一个“子辞典”(列表会做太)只与条目中,字段2> = 2(在本例中会是这样):
{
"sampleKey2": {
"field1" : "test2",
"field2": 2
},
"sampleKey3": {
"field1" : "test3",
"field2": 3
}
}
是否有比遍历所有字典元素和检查条件更好的方法?也许使用itemgetters和lambda函数?
谢谢!
PS:我用的python2.4,以防万一它的相关
mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)]
文档:
除了他想要一个字典,不是一个列表... –
“一个列表也会做” – bernie
您应该保留的各种记录 - 那就是 “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"
方法。
如果你需要这个高调的应用程序,我建议你看一看一些面向对象的DB系统为Python在那里,像ZODB等。
想法是创建一个“子辞典”(列表会做太)
如果你想有一个列表,你可以使用filter(或itertools.ifilter):
result_list = filter(lambda x: x.field2 > 2, mydict.values())
'最高效'将取决于字典内容相对于查找频率的变化频率。
如果字典经常变化,而且您不经常查看,那么最有效的方法是使用Adam Bernier发布的代码遍历iteritems并选择符合条件的对象。
如果词典变化不大,而且你做了很多查找,那么制作一个或多个逆词典可能会更快,例如,一个将“field2”值映射到具有该值的对象列表。
另外,如果你打算做复杂的查询,你可以把所有的数据到内存sqllite数据库,让SQL排序出来,或许通过一个ORM,如SQLAlchemy的
谢谢大家!这是非常有用的信息:) – BorrajaX