Python:从字典中获取值(对象),其中某个字段匹配特定值(或条件)

6 投票
5 回答
27812 浏览
提问于 2025-04-15 20:10

我有一个Python字典,这个字典的键是字符串,值是一些对象。

比如说,一个对象里面有一个字符串和一个整数。

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函数?

谢谢!

附注:我正在使用Python2.4,万一这有关系。

5 个回答

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等。

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

文档:

列表推导式iteritems()

8

要从你的 dict 创建一个新的 dict

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

撰写回答