【问题标题】:Python: Get values (objects) from a dictionary of objects in which one of the object's field matches a value (or condition)Python:从对象的一个​​字段与值(或条件)匹配的对象字典中获取值(对象)
【发布时间】:2016-10-26 09:43:23
【问题描述】:

我有一个 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 函数?

谢谢!

P.S.:我使用的是 Python2.4,以防万一

【问题讨论】:

  • 谢谢大家!!这是非常有用的信息:)

标签: python dictionary


【解决方案1】:

从您的dict 创建一个dict

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

【讨论】:

  • 我终于选择了这个解决方案 :) 谢谢!!
  • @BorrajaX,那么为什么不接受答案(大数字下方带有复选标记形图标)?这是 SO 的基本礼仪:感谢很好,但接受才是最重要的!
  • .. 哦……我不知道这是怎么回事! (这是我在这里的第一篇文章)
【解决方案2】:
mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)]

文档:

list-comprehensions, iteritems()

【讨论】:

    【解决方案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 对其表所做的那样索引。这可以很容易地从“list”派生一个类并覆盖“append", "insert", "__getitem__", "__delitem__""pop" 方法。

    如果您需要将它用于高级应用程序,我建议您查看一些 Python 的面向对象的 DB 系统,例如 ZODB 等。

    【讨论】:

      【解决方案4】:

      这个想法是创建一个“子字典”(列表也可以)

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

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

      【讨论】:

        【解决方案5】:

        “最有效”将取决于字典内容更改的频率与您进行查找的频率相比。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-24
          • 2013-11-19
          • 2022-01-22
          • 2020-09-04
          • 2016-10-24
          • 1970-01-01
          • 2015-10-04
          相关资源
          最近更新 更多