我想在字符串中查找并返回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的值。
答案 0 :(得分:6)
使用key
的{{1}}参数:
min
这实际上找到了min id,并在不创建新列表的情况下完成。
唯一的问题是,列表中的元素可能没有def find_min_id(l):
return min(l, key=lambda d: d.get("id", float('inf')))["id"]
键。出于这个原因,我不得不使用'id'
。因此,如果没有id密钥,函数将返回.get("id", float('inf'))
,这可能是不可取的。当给出一个空列表时,inf
会做什么,它会抛出一个异常,所以如果我们传递它的任何一个词都没有min()
键,我们可能会喜欢这样做。在这种情况下,生成器的最小值可能确实更好:
'id'
另一种方法是检查def find_min_id(l):
return min(d["id"] for d in l if "id" in d)
作为inf
的结果,但这更麻烦:
min
答案 1 :(得分: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条目的情况下放置最大浮点数的答案)。
答案 2 :(得分:2)
>>> 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
这就是第一部分的作用。列表推导的第一部分将某些附加到最终列表,即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
答案 3 :(得分:1)
你正试图找到最低的'字典。我们想要的是,找到列表中最低的'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
希望这有帮助!
答案 4 :(得分:1)
如果列表中没有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)
从数据中获取所有id
,or [None]
部分处理在数据中找不到id
密钥的情况。
答案 5 :(得分:0)
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)