我有一个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,以防它是相关的
答案 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)]
文档:
答案 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)