【问题标题】:how to get key of item from list of dictionary when using generator expressions使用生成器表达式时如何从字典列表中获取项目的键
【发布时间】:2018-10-13 10:16:57
【问题描述】:

我正在尝试了解生成器表达式及其工作原理。

我有一个这样的字典列表,

la = [ {'app_name': 'MKV58YCF8RR','time_diff': 17647},
       {'app_name': 'ZXG68HYW4BA','time_diff': 18132}]

我想从中获取time_diff 的最大值,我使用max 做到了这一点

max_val = max(value["time_diff"] for value in la)

这给了我,

18132

但我还想打印这个time_diffapp_name

预期输出:

ZXG68HYW4BA is 18132

电流输出

18132

有人可以告诉我如何获得app_name 密钥吗?

编辑:

我想我需要使用map,但不确定如何使用?

【问题讨论】:

    标签: python python-3.x generator


    【解决方案1】:

    la 上使用max 并提供一个可调用的key,这样您就可以获得具有最高time_diff 值的整个字典。

    >>> la = [{'app_name': 'MKV58YCF8RR','time_diff': 17647},
    ...        {'app_name': 'ZXG68HYW4BA','time_diff': 18132}]
    >>> 
    >>> max_d = max(la, key=lambda d: d['time_diff']) # dict with max time_diff
    >>> print('{d[app_name]} is {d[time_diff]}'.format(d=max_d))
    ZXG68HYW4BA is 18132
    

    谢谢,如果没有循环迭代整个列表,我不明白 lambda 是如何工作的。

    不要被lambda 分心。它被用作选择la的最大值的标准,但我们也可以将is写成普通函数。

    >>> def criterion(dictionary):
    ...     return dictionary['time_diff']
    ... 
    >>> max(la, key=criterion)
    {'app_name': 'ZXG68HYW4BA', 'time_diff': 18132}
    

    max 迭代la,使用la 的每个元素调用criterion,并返回la 的元素,其中criterion 是最大的。

    我可以像使用 lambda 一样提取它,同时使用 itemgetter 代替吗?

    当然!

    >>> import operator
    >>> max_d = max(la, key=operator.itemgetter('time_diff'))
    >>> print('{d[app_name]} is {d[time_diff]}'.format(d=max_d))
    ZXG68HYW4BA is 18132
    

    【讨论】:

    • 谢谢,如果没有循环遍历整个列表,我不明白 lambda 是如何在这里工作的。
    • @MaverickD 好的,我会添加解释。
    • 谢谢,我可以用地图代替吗?我的意思是仍在使用for 循环
    • @MaverickD 好吧,你可以在里面硬塞一个map,但目前的解决方案是直截了当的。
    • @MaverickD 你的解决方案是正确的,itemgetter 和我的 lambda 一样。我添加的只是提取print 中的键和值。
    【解决方案2】:

    首先确定最大值,就像你做的那样,然后选择具有这个值的项目:

    max_time_diff = max(item["time_diff"] for item in la)
    max_item = next(item for item in la if item["time_diff"] == max_time_diff)
    

    next() 从可迭代对象中选择下一项。

    在这种特殊情况下,iterable 的长度正好是一个项目,但理论上可能有多个项目的 time_diff 等于 max_time_diff,因此 next() 确保只有第一个匹配项目是采摘。

    【讨论】:

    • 但它不是在做同样的事情两次吗?
    • 嗯,它迭代输入列表两次(-ish),是的。平均而言,它不完全是两次,因为next() 一旦有一个项目就会立即停止迭代,所以第二个列表迭代被缩短了。我不会担心太多,但这不是 100% 最佳的。将key 函数赋予max() 会更好。
    猜你喜欢
    • 2014-04-23
    • 2015-12-06
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多