【问题标题】:Max key from other dictionary values function in PythonPython中其他字典值函数的最大键
【发布时间】:2018-12-22 03:52:12
【问题描述】:

我有一本字典

stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}

我从另一个提供这样的字典的程序中获取值

my_values = {'Web': OK, 'Host': WARN, 'System': FATAL}

现在我想将 my_values 中的值与 stats 的键进行比较,并获得最高的结果。

例如:

如果 my_values = {'Web': OK, 'Host': WARN, 'System': FATAL} 函数应该返回 FATAL

如果 my_values = {'Web': OK, 'Host': WARN, 'System': ERROR} 函数应该返回 ERROR

如果 my_values = {'Web': OK, 'Host': WARN, 'System': WARN} 函数应该返回 WARN

到目前为止,我只给出了给定字典的最大值。

import operator

def high_value(my_value):
    stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}

    print max(stats.iteritems(), key=operator.itemgetter(1))[0]

high_value (my_values)

【问题讨论】:

  • 为什么你在使用iteritems时标记了这个python 3.x,它甚至在Python 3中都不存在?
  • 是否要返回值而不是打印?你有什么问题?

标签: python python-2.7 dictionary


【解决方案1】:

您可以将其更改为 lambda:

import operator

def high_value(my_value):
    stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}
    return max(my_value.items(), key=lambda x: stats.get(x[1])) )

my_values = {'Web': "OK", 'Host': "WARN", 'System': "FATAL"}

print(high_value(my_values))

输出:

('System', 'FATAL')

如果你只想要'FATAL',你甚至不需要一个lambda,如果你在my_value.values()上操作dict.get就足够了:

def high_value(my_value):
    stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}
    return max(my_value.values(), key=stats.get) 

【讨论】:

    【解决方案2】:

    我会用这样的常量创建一个类

    class STATS(object):
        OK = 0
        SKIP = 1
        EXCEPTION = 2
        FATAL = 3
    
        LABELS = {
            OK: "Ok",
            FATAL: "Fatal"
        }
    

    并像这样使用它:

    myvals = {"Web": STATS.FATAL}
    result = STATS.LABELS[myvals["Web"]]
    print(result)
    

    【讨论】:

    • 你为什么要在这里上课?更不用说您的示例 dict 使用名称,而不是字符串,因此会抛出错误
    • 这些被称为enums,在py2.7中有一个backport of the standard library
    • 枚举也可以工作,是的,这是我的第一个想法。不错@TemporalWolf 我不知道它们也可以在 python 2 中使用。很棒的提示。
    • @roganjosh 我用这些常量的一些标签更新了我的答案。
    • 我的意思是你所做的事情有一个标准名称,enumerated type。如果您不需要 enum backport 的高级功能,这是一个很好的实现。
    【解决方案3】:

    只需迭代my_values dict 以通过比较stats dict 找到最大值

    import operator
    stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}
    my_values = {'Web': 'OK', 'Host': 'WARN', 'System': 'FATAL'}
    value_string, max_value='', -1
    for k,v in my_values.items():
        if max_value< stats[v]:
            max_value=stats[v]
            value_string=k
    print(value_string,max_value)
    

    输出

    ('System', 5)
    

    如果您需要所有信息,那么

    stats = {'OK':0, 'SKIP':1, 'EXCEPTION':2, 'WARN':3, 'ERROR':4, 'FATAL':5}
    my_values = {'Web': 'OK', 'Host': 'WARN', 'System': 'FATAL'}
    status,component, max_value='','', -1
    for k,v in my_values.items():
        if max_value< stats[v]:
            max_value=stats[v]
            component=k
            status=v
    print(component,max_value,status)
    

    输出

    ('System', 5, 'FATAL')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2019-02-06
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多