Python:从对象字典中获取值(对象),其中一个对象的字段与值(或条件)匹配

时间:2010-03-08 17:46:38

标签: python dictionary

我有一个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”字段> = 2的词典条目的最佳/最有效方法是什么?

这个想法是创建一个“子词典”(列表也会这样),只有field2> = 2的条目(在例子中就是这样):

{
    "sampleKey2": {
        "field1" : "test2",
        "field2": 2 
    },
    "sampleKey3": {
        "field1" : "test3",
        "field2": 3 
    }
}

有没有比走遍所有字典元素更好的方法并检查条件?也许使用itemgetters和lambda函数?

谢谢!

P.S。:我正在使用Python2.4,以防它是相关的

5 个答案:

答案 0 :(得分:8)

dict

中制作dict
subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)

答案 1 :(得分:4)

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

文档:

list-comprehensionsiteritems()

答案 2 :(得分: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和其他。

答案 3 :(得分:2)

这个想法是创建一个“子词典”(列表也会这样做)

如果您想要一个列表,可以使用filter(或itertools.ifilter):

result_list = filter(lambda x: x.field2 > 2, mydict.values())

答案 4 :(得分:0)

'效率最高'取决于字典内容与您查找频率相比的频率变化。

如果字典经常更改并且您不经常查找,那么使用Adam Bernier发布的代码,最有效的方法将遍历iteritems并选择符合条件的对象。

如果字典没有太大变化并且您进行了大量的查找,那么制作一个或多个反向字典可能会更快,例如将“field2”值映射到具有该值的对象列表。

或者,如果您要进行复杂查询,可以将所有数据放入内存中的sqllite数据库并让SQL对其进行排序,可能通过ORM(如SqlAlchemy)