Python:在嵌套的dict中查找最小值

时间:2015-05-07 20:18:49

标签: python dictionary

Python 2.7

这是Python: get key with the least value from a dictionary BUT multiple minimum values

的变体

我的字典看起来像这样:

dates = {
    'first record': {
        'first date': '1985',
        'last date': '2000',
        },
    'second record': {
        'first date': '1985',
        'last date': '2012',
        },
    'third record': {
        'first date': '1985',
        'last date': '2000',
        },
    'fourth record': {
        'first date': '2000',
        'last date': '2014',
        }
}

我正在尝试检索最旧记录的密钥,其中最旧的记录表示最早的第一个日期和最早的最后日期。在上面的例子中,'第一个记录'和第三个记录'都会被退回。

我很难找到如何使用在类似(但不太复杂)的问题的答案中描述的itervalues / iteritems方法来实现解决方案。有人可以提供一些指导吗?

1 个答案:

答案 0 :(得分:0)

您只需要按键:

mn_year = min((int(d['first date']), int(d['last date'])) for d in dates.values())

print(mn_year)

 print([k for k in dates
       if (int(dates[k]['first date']), int(dates[k]['last date'])) == mn_year])
(1985, 2000)
['third record', 'first record']

如果值不相关,则需要分别计算min:

dates = {
    'first record': {
        'first date': '1984',
        'last date': '2001',
    },
    'second record': {
        'first date': '1985',
        'last date': '2012',
    },
    'third record': {
        'first date': '1985',
        'last date': '2000',
    },
    'fourth record': {
        'first date': '2000',
        'last date': '2014',
    }
}


mn_first = min((int(d['first date'])) for d in dates.values())
mn_last = min((int(d['last date'])) for d in dates.values())


print([k for k,v in dates.iteritems()
       if int(v['first date']) == mn_first or int(v['last date']) == mn_last])

使用第一个代码返回['third record', 'first record']而不是['first record']

获取元组的最小值不会获得每个键的最小值,而是获得配对元组的最小值,因此任何唯一的first date都不一定与最小last date配对,除非min {{{ 1}}碰巧在同一个字典中。

而不是循环两次以获得最小值,我们可以使用循环同时获得两者:

last date