【问题标题】:Find lowest value in a list of dictionaries in python在python中的字典列表中查找最小值
【发布时间】:2013-11-06 07:19:39
【问题描述】:

我想在一个字符串中查找并返回一个id的最小值,例如:

find_min_id([{"nonid": "-222", "id": 0}, {"id": -101}])
-101
find_min_id([{’id’: 63, 'id': 42}])
42

到目前为止,我有这个:

def find_min_id(list):
    return min(list)

但这给出了:

{'id': -101}

我只想要最低 id 的值。

【问题讨论】:

    标签: python list return


    【解决方案1】:

    使用minkey参数:

    def find_min_id(l):
        return min(l, key=lambda d: d.get("id", float('inf')))["id"]
    

    这实际上找到了最小 id,并且没有创建新列表。

    唯一的问题是,列表中的元素可能没有'id' 键。出于这个原因,我不得不使用.get("id", float('inf'))。因此,如果没有 id 键,该函数将返回 inf,这可能是不可取的。 min() 在给定一个空列表时会引发异常,因此如果我们传递给它的任何字典都没有 'id' 键,我们可能希望这样做。在这种情况下,生成器方法的最小值可能确实更好:

    def find_min_id(l):
        return min(d["id"] for d in l if "id" in d)
    

    另一种方法是检查inf 作为min 的结果,但这更麻烦:

    import math
    def find_min_id(l):
        res = min(l, key=lambda d: d.get("id", float('inf')))["id"]
        if math.isinf(res):
            raise ValueError("No dict has an 'id' key")
        return res
    

    【讨论】:

    • 太棒了。还是我傻,没想到我们只需要'id'键..
    • 如果其中没有id,这将不起作用! :P 我们都在不知不觉中使用了min! :P
    • 如果输入无效,所有答案都试图返回None。在这种情况下,我说得更好,以获得例外。取决于你在做什么我猜..
    • 这也适用于相关情况,您希望整个字典对应于最小 id 而不仅仅是“id”。您可以从末尾删除['id'],它仍然有效。
    【解决方案2】:

    另一种方法,但适用于字典中没有 id 以及根本没有 id 的字典时:

    def find_min_id(lst):
        ids = [d['id'] for d in lst if 'id' in d]
        return min(ids) if ids else None
    

    没有例外,并且没有为人为扩展列表运行min(即在条目不是 id 条目时放置最大浮点数的答案)。

    【讨论】:

      【解决方案3】:

      如果列表中没有id 键,则以下代码返回None

      >>> data = [{"nonid": "-222", "id": 0}, {"id": -101}, {"nonid":-200}]
      >>> min(filter(lambda x: x is not None, map(lambda x: x.get('id', None),
      ...    data)) or [None])
      -101
      

      这里filter(lambda x: x is not None, ...)过滤掉没有id的字典, map(lambda x: x.get('id', None), data) 从数据中获取所有idor [None] 部分处理在数据中找不到id 键的情况。

      【讨论】:

        【解决方案4】:

        您正在尝试查找“最低”的词典。我们想要的是,在列表中找到最低的'id' 值。

        def find_min_id(lst):
            return min([d[key] for key in d for d in lst if key=="id"])
        

        另外,避免使用list 作为变量名,它会覆盖内置函数list()

        一个小演示:

        >>> def find_min_id(lst):
            return min([d[key] for key in d for d in lst if key=="id"])
        
        >>> find_min_id(lst)
        -101
        

        希望这会有所帮助!

        【讨论】:

          【解决方案5】:
          >>> ids = [{"nonid": "-222", "id": 0}, {"id": -101}]
          >>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
          -101
          >>> ids = [{'id': 63}, { 'id': 42}]
          >>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
          42
          

          试试上面的。

          你可以把它变成一个函数定义:

          def find_lowest(ids):
              return min([val for obj in ids for key, val in obj.items() if key == 'id'])
          

          工作example

          让我解释一下我在做什么。首先,min 函数接受一个可迭代对象作为参数。所以,让我演示一下:

          >>> min([1,2,3,4,6,1,0])
          0
          

          所以,这意味着,我们实质上是从我们得到的列表中取最小值,[val for obj in ids for key, val in obj.items() if key == 'id']

          现在,您可能想知道,那里发生了什么?一开始可能有点吓人,但这是一个列表理解。你说什么?好吧,简单来说,它是一个简洁的我们,我们在其中列出:

          让我从第一部分开始,不,它不是陈述的开头:

          for obj in ids
          

          我们在这里所做的是遍历ids 中的所有字典对象。现在,我们在这里使用该对象:

          key, val in obj.items() if key == 'id'
          

          由于 object 是一个 dict,我们使用 items 函数来获取一个生成器,该生成器提供一个键值对元组。在这样的对象中:{'id': 100}id 将是它们的键,100 将是值。因此,我们将遍历 所有 字典对象中的项目,并且 如果 key 恰好是 id,然后我们将其附加到列表中:

          [val
          

          这就是第一部分的作用。列表理解的第一部分将 something 附加到最终列表中,即val

          更新:

          如果由于某种原因,列表不包含以id 作为键的任何东西,那么它将抛出一个ValueError,因为min 不接受空列表,所以解决这个问题,我们可以检查:

          def find_lowest(ids):
              _ret = [val for obj in ids for key, val in obj.items() if key == 'id']
              if _ret:
                  return min(_ret)
              else:
                  return None
          

          【讨论】:

          • 是的,这当然会引发错误。我们都在这里使用min!此外,问题中没有提到处理空列表。
          • @user2858846 如果此答案回答了您的问题,请考虑投票并接受答案。
          【解决方案6】:

          list 是 Python 中的内置类型。不要将其用作标识符

          def find_min_id(my_list)  
              id_list = []
              for record in my_list:
                  if 'id' in record:
                      id_list.append(record['id'])
              return min(id_list)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-26
            • 2012-07-28
            • 2015-07-18
            • 2019-02-09
            • 1970-01-01
            • 2015-01-16
            • 1970-01-01
            • 2014-10-06
            相关资源
            最近更新 更多