如何从特定SUBKEY中找到最低正值的顶级KEY?

时间:2016-05-06 23:56:18

标签: python dictionary nested min

我的数据如下:

{   
    'test1462477941.log': {   'end_diff': 537,
                               'file_epoch': 1462477941,
                               'start_diff': -33},
    'test1462478161.log': {   'end_diff': 317,
                               'file_epoch': 1462478161,
                               'start_diff': 284},
    'test1462478346.log': {   'end_diff': 132,
                               'file_epoch': 1462478346,
                               'start_diff': 99},
}

我想要做的是找到最低的,积极的" start_diff"任何键中的值并打印相对顶级键(文件名)。数据结构让我有点失望。

如果使用上面的数据,它应该找到并打印出来:

test1462478346.log

有优雅的方法吗?如果没有,我会采取任何措施

2 个答案:

答案 0 :(得分:1)

使用filter删除非肯定的minkey进行搜索:

a = {
    'test1462477941.log': {'end_diff': 537,
                           'file_epoch': 1462477941,
                           'start_diff': -33},
    'test1462478161.log': {'end_diff': 317,
                           'file_epoch': 1462478161,
                           'start_diff': 284},
    'test1462478346.log': {'end_diff': 132,
                           'file_epoch': 1462478346,
                           'start_diff': 99},
}

only_positive_start_diff = filter(lambda x: x[1]['start_diff'] > 0, a.items())
min_start_diff = min(only_positive_start_diff, key=lambda x: x[1]['start_diff'])

print min_start_diff[0]  # Min log file

没有lambda,它看起来像是:

def only_positive(x):
    return x[1]['start_diff'] > 0

def min_start(x):
    return x[1]['start_diff']

only_positive_start_diff = filter(only_positive, a.items())
min_start_diff = min(only_positive_start_diff, key=min_start)

print min_start_diff[0]

答案 1 :(得分:1)

这是一个使用内置函数reduce的解决方案:

import sys
filename, start_diff = reduce(
    lambda curMin, item:
        curMin if item[1]['start_diff']<0 or item[1]['start_diff']>curMin[1] else (item[0], item[1]['start_diff']),
    inputDict.iteritems(),
    ('not_found.log', sys.maxint))

print filename

请注意,代码是用Python 2.7编写的。如果您使用Python 3.x,那么您应该在functools中找到reduce函数,并且dict.iteritems()已更改为dict.items()