автоматически ли строка преобразуется в float перед сравнением

#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.