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