2013-12-07 4 views
0

Im пытается использовать max() func, чтобы найти максимальное значение в заданном списке. Im, создавая список для данного столбца из txt-файла (представляющий таблицу, каждая строка имеет имя и то же количество столбцов данных). например - John, M, 53,175,8000 (имя, пол, возраст, рост, зарплата) Проблема в том, что я не знаю, будет ли столбец содержать числа или строки. Если столбец содержит целые числа, то он выглядит так (например): ['1', '40', '5', '520', '1025'] В этом случае функция max() сравнивает первая цифра и возвращает неверное значение ('520'). Вот код рецепта - (Все в классе) Первый func. возвращает список столбца. Второй возвращает имя/имена, которые имеют максимальное значение данного столбца.Проблема с использованием max (list)

def get_column(self,colname): 
    if colname not in self.columns: 
     raise ValueError('Colname doesnt exists') 
    col_indx = self.columns.index(colname)+1 
    col_data = [] 
    for i in range(len(self.names)):    
     col_data.append(self.data[i][col_indx])  
    return col_data 

def get_row_name_with_max_value(self,colname): 
    if colname not in self.columns: 
     raise ValueError('Colname doesnt exists') 
    col_list = self.get_column(colname) 
    max_val = max(col_list) 
    counter = col_list.count(max_val) 
    max_name = [] 
    k = -1 
    for i in range(counter): 
     index = col_list.index(max_val, k+1) 
     max_name.append(self.data[index][0]) 
     k = index 
    return ', '.join(max_name) 

спасибо большое!

+0

Если есть только строки, что должно быть максимальное значение, возвращаемое? – thefourtheye

+0

более высокое значение..сли говорят, что список выглядит так ['a', 'b', 'c'] - поэтому возвращаемое значение должно быть: c – user3077563

ответ

1

Проверьте, если ваш список состоит только из числовых строк перед вызовом max, если это так, используйте key=int:

def kmax(col): 
    key = int if all(x.isdigit() for x in col) else str 
    return max(col, key=key) 

print kmax(['1','40','5','520','1025']) # 1025 
print kmax(['foo','bar','40','baz']) # foo 
+0

Спасибо, много чувак! – user3077563

3

Вы можете использовать ключ аргумент функции max() указать сравнение, как Интс:

In [1]: l = [1,'2',3,'100'] 

In [2]: max(l, key = int) 
Out[2]: '100' 

Возможно, вы хотите применить int() к выходу, а также.

+0

Спасибо за ответ! но что, если у меня есть список в строках? – user3077563

+0

Теперь он будет работать для целых чисел, но если у меня есть список строк, это вызовет ошибку. Как я могу это решить? Благодаря! – user3077563

+0

Я не совсем понимаю ... В моем примере есть строки. Какую ошибку вы делаете? Можете ли вы сделать минимальный пример? – Zah

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