Функция Max key из других значений словаря в Python

1

У меня есть словарь

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

Я получаю значения из другой программы, которая дает такой словарь

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

Теперь я хочу сравнить значение my_values с ключами статистики и получить максимальный результат.

Например:

если 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)
  • 1
    Почему вы пометили этот Python 3.x, когда вы используете iteritems который даже не существует в Python 3?
  • 0
    Вы хотите вернуть значение вместо печати? В чем дело?
Теги:
dictionary
python-2.7

4 ответа

3

Вы можете изменить его на лямбду:

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', вам даже не нужна лямбда, достаточно dict.get, если вы работаете с my_value.values():

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) 
  • 1
    Спасибо, это решило мою проблему.
1

Я бы сделал класс с такими константами, как это

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)
  • 0
    Зачем тебе делать уроки здесь? Не говоря уже о том, что ваш пример dict использует имя, а не строку, поэтому выдает ошибки
  • 2
    Они называются enums и для py2.7 есть бэкпорт стандартной библиотеки.
Показать ещё 3 комментария
0

Если вам нужно сделать это в одну строку и без использования operator, вы можете попробовать это:

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

maximum = max(list(my_values.values()), key=lambda elem: stats[elem])
print(maximum)

Выход:

FATAL
0

Просто 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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню