Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从对象字典中获取值(对象),其中一个对象';s字段与值(或条件)匹配_Python_Dictionary - Fatal编程技术网

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

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

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

其想法是创建一个“子字典”(列表也可以),只包含字段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)