我想在字符串中查找并返回 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 的值。
使用 的key
参数min
:
def find_min_id(l):
return min(l, key=lambda d: d.get("id", float('inf')))["id"]
这实际上找到了最小 id,并且在不创建新列表的情况下执行此操作。
唯一的问题是,列表中的元素可能没有'id'
键。出于这个原因,我不得不使用.get("id", float('inf'))
. inf
因此,如果没有 id 键,该函数将返回,这可能是不可取的。当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
情况:
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 条目的地方放置最大浮点数的答案)。
>>> 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'])
工作示例。
让我解释一下我在做什么。首先,该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, 是 a dict
,我们使用该items
函数来获取一个生成器,该生成器提供一个键值对元组。在像这样的对象中:{'id': 100}
将id
是它们的键和100
值。因此,我们将遍历字典对象中的所有项目,如果恰好key
是id
,那么我们将其附加到列表中:
[val
这就是第一部分所做的。列表推导的第一部分将一些内容附加到最终列表中,即val
.
如果由于某种原因,列表不包含任何带有id
as 键的内容,那么它会抛出ValueError
asmin
不接受空列表,因此为了解决这个问题,我们可以检查:
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
您正在尝试查找“最低”的词典。我们想要的是,找到'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
希望这可以帮助!
None
如果列表中没有id
键,则返回以下代码。
>>> 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)
获取 all ,部分处理在数据中找不到键的情况。id
or [None]
id
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)