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,以防万一它的相关

+0

谢谢大家!这是非常有用的信息:) – BorrajaX

为了使dict从您的dict

subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2) 
+0

我终于选择了这个解决方案:)谢谢! – BorrajaX

+1

@BorrajaX,为什么不接受答案(大数字下的复选标记形状图标)?这是SO的基本礼仪:谢谢你很好,但接受是重要的! –

+0

..哦......我不知道这是如何工作的! (这是我的第一篇文章) – BorrajaX

mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)] 

文档:

list-comprehensionsiteritems()

+0

除了他想要一个字典,不是一个列表... –

+4

“一个列表也会做” – 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的