#python-3.x
#python-3.x
Вопрос:
Преобразует ли Python автоматически второй элемент в число с плавающей точкой перед сравнением в приведенном ниже сценарии, если нет, что нужно изменить?
from operator import itemgetter
data = [['A', '2', '4'], ['B', '2', '12'],
['C', '2', '88'], ['D', '2', '88']]
mx = max(data, key=itemgetter(2))[2]
print(mx)
mx_values = [d for d in data if d[2] == mx]
print(mx_values)
#[['C', '2', '88'], ['D', '2', '88']]
Заранее благодарю вас,
Комментарии:
1. Он не преобразует его в float или int перед сравнением. Вы можете проверить это, изменив значение C на
'088'
. Он НЕ выберет значение.
Ответ №1:
Он сравнивает их как строки, вы можете определить свой собственный ‘itemgetter’, который выполняет преобразование с плавающей запятой. Но, возможно, ваши числа не должны быть строками в первую очередь.
def float_itemgetter(index):
return lambda x: float(x[index])
data = [['A', '2', '4'], ['B', '2', '12'],
['C', '2', '88'], ['D', '2', '88']]
mx = max(data, key=float_itemgetter(2))[2]
print(mx)
mx_values = [d for d in data if d[2] == mx]
print(mx_values)
Ответ №2:
Если вы преобразуете значение в int перед тем, как присвоить его обратно mx , вы можете сравнивать целые числа. Если вы считаете, что ваши данные будут иметь значения с плавающей запятой, то лучше всего преобразовать их в float и сравнить.
Вот как это сделать.
from operator import itemgetter
data = [['A', '2', '4'], ['B', '2', '12'],
['C', '2', '088'], ['D', '2', '88']]
mx = int(max(data, key=itemgetter(2))[2]) #converted it to int
print(mx)
mx_values = [d for d in data if int(d[2]) == mx] #comparing with int
print(mx_values)
#[['C', '2', '88'], ['D', '2', '88']]
Вывод будет:
[['C', '2', '088'], ['D', '2', '88']]
Обратите внимание, что ‘088’ и ’88’ оба были сопоставлены с максимальным значением 88.