Найдите максимальное значение int из списка, который содержит как str, так и int python

Ищем max из списка комбайнов следующим образом:

['filename1', 1696, 'filename2', 5809,....]

Я пробовал следующее:

max(['filename1', 1696, 'filename2', 5809,....])

которые возвращают мне TypeError: '>' not supported between instances of 'int' and 'str'. Любое предложение поможет. Я хочу найти целочисленное значение max из упомянутого выше списка.


person abhi1610    schedule 26.04.2018    source источник
comment
что вы ожидаете, если сравните «filename1» и «1696»?   -  person Edwin van Mierlo    schedule 26.04.2018
comment
Почему вы смешиваете строки и целые числа в одном списке? Может быть, у вас должен быть список кортежей или список словарей?   -  person Barmar    schedule 26.04.2018
comment
Что больше - имя_файла1 или 1696?   -  person Psytho    schedule 26.04.2018
comment
@Psytho подожди, я знаю это!   -  person Jean-François Fabre    schedule 26.04.2018
comment
@Barmar Бармар, я не смешиваю это. Это то, что я получаю от другого ответа API.   -  person abhi1610    schedule 26.04.2018
comment
@EdwinvanMierlo Нет. Я не хочу сравнивать «filename1» с «1696», но на основе значения int я должен выбрать отмену выбора предыдущего проиндексированного значения str. Я не очень хорошо знаю английский, но надеюсь, что теперь я вам это ясно объяснил.   -  person abhi1610    schedule 26.04.2018
comment
@Psytho, я перефразировал свой вопрос. Я не сравниваю str с int. Я хочу найти максимум из int значений в списке. Не затрагивая значения str.   -  person abhi1610    schedule 26.04.2018


Ответы (5)


Используйте list comprehension с isinstance, чтобы извлечь int, а затем используйте max.

Пример:

f = ['filename1', 1696, 'filename2', 5809]
print(max([i for i in f if isinstance(i, int)]))
#or generator
print(max((i for i in f if isinstance(i, int))))    #Better Option

Вывод:

5809
5809
person Rakesh    schedule 26.04.2018
comment
@хелвуд. Спасибо. Я не думаю, что. - person Rakesh; 26.04.2018
comment
В примере с генератором внутренние () неявны и не нужны (пока генератор является единственным аргументом). - person Graipher; 26.04.2018
comment
@Ракеш Спасибо за ответ. Это больше похоже на общее с точки зрения разных типов данных. - person abhi1610; 26.04.2018

Если ваши реальные данные также имеют чередующиеся строки и целые числа, как в вашем примере, вы можете просто повторять шаги размером 2, начиная со второго элемента:

values = ['filename1', 1696, 'filename2', 5809, ...]
max(values[1::2])
# 5809

Обратите внимание, что этот срез создает новый список (поэтому в зависимости от размера исходного списка он может быть очень большим).

person Graipher    schedule 26.04.2018

Та же идея isinstance может быть применена к фильтру:

f = ['filename1', 1696, 'filename2', 5809]
max(filter(lambda i: isinstance(i, int), f))

Кроме того, если вам нужно включить в сравнение более одного типа данных, например: floats, вы можете просто использовать кортеж для проверки сравниваемых данных:

max(filter(lambda i: isinstance(i, (int, float)), f))
person cmaureir    schedule 26.04.2018

Вы также можете использовать предложение try...except.

lst = ['filename1', 1696, 'filename2', 5809]
numbers = []

for item in lst:
    try:
        numbers.append(int(item))
    except ValueError:
        pass # Ignore items which are not numbers

print(max(numbers))
# 5809
person srikavineehari    schedule 26.04.2018

max() ожидает повторение с сопоставимыми значениями. Сначала вы должны игнорировать строку из списка, а затем использовать для нее max().

Используйте понимание списка, чтобы рассматривать только целые значения

file_data = ['filename1', 1696, 'filename2', 5809,....]
max([elem for elem in file_data if isinstance(elem, int)])

Если вы также ожидаете значения с плавающей запятой, вы можете обновить его как:

max([elem for elem in file_data if not isinstance(elem, str)])
person akshat    schedule 26.04.2018