2016-09-17 5 views
-1

Я хочу получить максимальное значение из списка.Как найти максимальное значение двух чисел в python?

List = ['1.23','1.8.1.1'] 
print max(List) 

Если я печатаю это я получаю 1.8.1.1 вместо 1.23. Что я делаю неправильно?

+4

Как выглядит «1.8.1.1»? И почему это должно быть/не быть ответом? –

+0

Что ты сравниваете? Номера версий? – Wickramaranga

+1

да, они являются номерами verison в MKS (инструмент управления версиями) – harika

ответ

0

Это не цифры, они являются строками, и поэтому они сортируются лексикографически. Так как символ 8 появляется после 2, 1.8.1.1 возвращается как максимум.

Один из способов решить эту проблему, чтобы написать свою собственную функцию сравнения, которая принимает каждую часть строки как int и сравнивает их численно:

def version_compare(a, b): 
    a_parts = a.split('.') 
    b_parts = b.split('.') 
    a_len = len(a_parts) 
    b_len = len(b_parts) 
    length = min(a_len, b_len) 

    # Compare the parts one by one 
    for i in range(length): 
     a_int = int(a_parts[i]) 
     b_int = int(b_parts[i]) 

     # And return on the first nonequl part 
     if a_int != b_int: 
      return a_int - b_int 

    # If we got here, the longest list is the "biggest" 
    return a_len - b_len 

print sorted(['1.23','1.8.1.1'], cmp=version_compare, reverse=True)[0] 
+0

Зачем вам нужно сортировать? Эта функция с небольшим обновлением может дать максимум – prakharsingh95

1

Самый простой способ, чтобы использовать сравнение кортежа.
Скажи:

versions = ['1.23','1.8.1.1'] 

def getVersionTuple(v): 
    return tuple(map(int, v.strip().split('.'))) 

Теперь вы можете использовать, print(max(map(getVersionTuple, versions))), чтобы получить максимум.

EDIT:

Вы можете использовать '.'.join(map(str, m)), чтобы получить исходную строку (при m имеет максимальный кортеж).

+0

с этим выходом (1, 23). Вместо этого он должен дать 1,23 – harika

0

Аналогичный подход - если эти строки номер версии - это превратить строку версии в список целого:

vsn_list=['1.23', '1.8.1.1'] 
print sorted([ [int(v) for v in x.split(".")] for x in vsn_list ]) 

При сравнении строк, они сравниваются символ за символом поэтому любая строка, начиная с ' 2 'будет сортироваться до строки, начинающейся с' 8 ', например.

Смежные вопросы