在python中查找字典列表中的最低值

时间:2013-10-27 14:33:51

标签: python list return

我想在字符串中查找并返回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的值。

6 个答案:

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

UPDATE:

如果出于某种原因,该列表不包含任何并以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)从数据中获取所有idor [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)