У меня есть словарь
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)
Вы можете изменить его на лямбду:
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)
Я бы сделал класс с такими константами, как это
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)
Если вам нужно сделать это в одну строку и без использования 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
Просто 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')
iteritems
который даже не существует в Python 3?