Python:从对象字典中获取值(对象),其中一个对象';s字段与值(或条件)匹配
我有一个python字典,它的键是字符串,值是对象 例如,一个具有一个字符串和一个int的对象Python:从对象字典中获取值(对象),其中一个对象';s字段与值(或条件)匹配,python,dictionary,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
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的词典条目的最佳/最有效方法是什么
其想法是创建一个“子字典”(列表也可以),只包含字段2>=2的条目(在本例中如下所示):
有没有比遍历所有字典元素并检查条件更好的方法?也许使用ItemGetter和lambda函数
谢谢大家!
注:我正在使用Python2.4,以防万一
mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)]
文件:
,您应该将各种记录(即“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使用其表索引所做的那样。这可以很容易地从“list”派生类,并重写“append”、“insert”、“getitem”、“delitem”和“和“pop”
方法
如果您需要一个高知名度的应用程序,我建议您看看一些面向对象的Python数据库系统,比如ZODB和其他 想法是创建一个“子字典”(列表也可以)
如果您想要列表,您可以使用(或):
“最有效”将取决于字典内容更改的频率与查找的频率
如果字典经常更改,而查找的频率较低,那么最有效的方法就是遍历iteritems,并使用Adam Bernier发布的代码选择符合条件的对象
如果字典变化不大,并且您进行了大量查找,则创建一个或多个反向字典可能会更快,例如,将“field2”值映射到具有该值的对象列表
或者,如果您要执行复杂的查询,您可以将所有数据放入内存中的sqllite数据库,让SQL对其进行排序,也许可以通过诸如SqlAlchemy之类的ORM从您的dict
生成dict
subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)
谢谢大家!!这是非常有用的信息:)我终于选择了这个解决方案:)谢谢@BorrajaX,那么为什么不接受答案(大数字下有复选标记形状的图标)?这就是最基本的礼节:感谢是美好的,但接受才是最重要的!。。哦。。。我不知道这是怎么回事!(这是我在这里的第一篇帖子)
result_list = filter(lambda x: x.field2 > 2, mydict.values())
subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)