5

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

4

6 回答 6

7

使用 的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
于 2013-10-27T14:40:54.337 回答
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 条目的地方放置最大浮点数的答案)。

于 2013-10-27T14:39:28.840 回答
1
>>> 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值。因此,我们将遍历字典对象中的所有项目,如果恰好keyid,那么我们将其附加到列表中:

[val

这就是第一部分所做的。列表推导的第一部分将一些内容附加到最终列表中,即val.

更新:

如果由于某种原因,列表不包含任何带有idas 键的内容,那么它会抛出ValueErrorasmin不接受空列表,因此为了解决这个问题,我们可以检查:

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
于 2013-10-27T14:39:48.760 回答
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

希望这可以帮助!

于 2013-10-27T14:41:30.467 回答
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)获取 all ,部分处理在数据中找不到键的情况。idor [None]id

于 2013-10-27T14:48:16.073 回答
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)
于 2013-10-27T14:54:35.307 回答