Макс в позиции х в списке списков - PullRequest
0 голосов
/ 18 ноября 2018

Как получить максимальное значение в позиции x в списке списков и вернуть его вместе с данными в позиции 0? Образец моего текущего списка вставлен ниже. Я думал о создании другого списка, который содержит элементы, которые я хочу, затем сортировать этот, но я предполагаю, что лучше сделать это

Данные, выводимые в данный момент

[['Name1', '1 (5)', '0', '0', '0', 'TeamPos', 'TeamA'], 
 ['Name2', '13 (0)', '5', '4', '0', 'TeamPos', 'TeamB'], 
 ['Name3', '4 (1)', '2', '1', '0', 'TeamPos', 'TeamC']]

Ожидаемый результат будет - допустим, я хотел получить максимальное значение для всех списков в индексе 2:

Name2, 5

РЕДАКТИРОВАТЬ: Попытка передать данные из моей первой функции в функцию, предложенную ползунком, и я получаю NameError: имя 'data' не определено. Я также пытался передать, когда вызывается get_max, и это не сработало либо

def get_max(lst, i, key_func=None):

    data = squads()

    if not key_func: key_func = lambda x: x[i]
    res = max(lst, key=key_func)
    return [res[0], res[i]]

print(get_max(data,2, lambda x: int(x[2])))

Кроме того, если я попробую приведенное ниже, а затем запусту его, я получу следующую ошибку: «Аргумент позиции следует за аргументом ключевого слова. Затем я попытался изменить порядок, в котором значения объявляются при объявлении функции, но она становится грязной, особенно когда я не очень понимаю, как работает эта функция

print (get_max (data = squads (), 2, lambda x: int (x [2])))

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Вы также можете использовать max с key:

data = [['Name1', '1 (5)', '0', '0', '0', 'TeamPos', 'TeamA'], 
        ['Name2', '13 (0)', '5', '4', '0', 'TeamPos', 'TeamB'], 
        ['Name3', '4 (1)', '2', '1', '0', 'TeamPos', 'TeamC']]

def get_max(lst, i, key_func=None):
    if not key_func: key_func = lambda x: x[i]
    res = max(lst, key=key_func)
    return [res[0], res[i]]

print(get_max(data, 2, lambda x: int(x[2])))
# ['Name2', '5']

print(get_max(data, 6))
# ['Name3', 'TeamC']

Способ работы get_max заключается в том, что вы указываете свой 2-й список, индекс, который вы хотите получить, и ключевую функцию, которую вы хотите передать в max. Если функция клавиши не предусмотрена, используется значение по умолчанию (в частности, lambda x: x[i]).

Предполагается, что ключевая функция определяет, какой столбец следует учитывать для определения максимума вашего 2-го списка.

Редактировать

Вы определяете data внутри функции get_max, но используете ее вне функции. Измените это на следующее:

def get_max(lst, i, key_func=None):
    if not key_func: key_func = lambda x: x[i]
    res = max(lst, key=key_func)
    return [res[0], res[i]]

data = squads()
print(get_max(data,2, lambda x: int(x[2])))
0 голосов
/ 18 ноября 2018

Если данные очень большие, вы можете выделить интересующий вас столбец и выполнить «ленивый» прогон max:

list_of_lists = [..] # your data
target_idx = 2
col_of_interest = ((lst[target_idx], idx) for idx, lst in enumerate(list_of_lists))
max_val, location = max(col_of_interest)
print (list_of_lists[location][0], max_val)
# Name2 5

При этом не создаются промежуточные списки (или списки их списков).

Как отмечает @Austin, max () может не дать желаемого результата, так как элементы являются строками, и в этом случае вы можете захотеть предварительно организовать ленивый столбец с int():

col_of_interest = ((int(lst[target]), idx) for idx, lst in enumerate(list_of_lists))

0 голосов
/ 18 ноября 2018

Сортировка была бы вполне уместна. Допустим, вас интересует 2-ая колонка:

POS = 2
maximal = sorted(your_list, key=lambda x: x[POS])[-1]
[maximal[0], maximal[POS]]
#['Name2', '5']

Имейте в виду, что sorted сортирует строки в лексикографическом порядке. Если вы хотите рассматривать ваши столбцы как числа, преобразуйте их в числа при сортировке:

maximal = sorted(your_list, key=lambda x: int(x[POS]))[-1]
...