use*_*846 5 python return list
我想在字符串中查找并返回id的最小值,例如:
find_min_id([{"nonid": "-222", "id": 0}, {"id": -101}])
-101
find_min_id([{’id’: 63, 'id': 42}])
42
Run Code Online (Sandbox Code Playgroud)
到目前为止我有这个:
def find_min_id(list):
return min(list)
Run Code Online (Sandbox Code Playgroud)
但这给了:
{'id': -101}
Run Code Online (Sandbox Code Playgroud)
我只想要最低id的值.
使用key参数min:
def find_min_id(l):
return min(l, key=lambda d: d.get("id", float('inf')))["id"]
Run Code Online (Sandbox Code Playgroud)
这实际上找到了min 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)
Run Code Online (Sandbox Code Playgroud)
另一种方法是检查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
Run Code Online (Sandbox Code Playgroud)
另一种方法,但适用于字典中没有的情况,以及根本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
Run Code Online (Sandbox Code Playgroud)
没有例外,也没有运行min人为扩展的列表(即,在条目不是 id 条目的情况下放置最大浮点数的答案)。