python max (): как игнорировать объекты в списке - PullRequest
0 голосов
/ 13 октября 2018

У меня есть набор списков, похожих на этот:

list = [datetime.datetime(1900, 1, 1, 16, 5), 'NA', 'NA', 'NA', 
    'NA', datetime.datetime(1900, 1, 1, 16, 49)]

Я хочу получить максимальное значение в каждом списке, не принимая во внимание значения 'NA'.

КогдаЯ использую функцию max () Я получил следующую ошибку:

TypeError: '>' не поддерживается между экземплярами 'str' и 'datetime.datetime'

Ответы [ 6 ]

0 голосов
/ 13 октября 2018
import datetime
dates_list=[datetime.datetime(1900, 1, 1, 16, 5), 'NA', 'NA', 'NA', 'NA', datetime.datetime(1900, 1, 1, 16, 49)]
# Efficient to use generators rather than producing entire list
print(max((x for x in dates_list if x != 'NA'))) # Notice () instead of []

Выход:1900-01-01 16: 49: 00

0 голосов
/ 13 октября 2018

Если вы открыты для использования панд, вы можете позволить библиотеке решить, что является ошибкой, а что нет.

import pandas as pd
import datetime

list1 = [datetime.datetime(1900, 1, 1, 16, 5), 'NA', 'NA', 'NA', 'NA', datetime.datetime(1900, 1, 1, 16, 49)]
print(pd.to_datetime(list1, errors='coerce').max().to_pydatetime())

возвращает:

1900-01-01 16:49:00
0 голосов
/ 13 октября 2018

Вы можете сначала выбрать filter неправильные элементы:

l=[datetime.datetime(1900, 1, 1, 16, 5), 'NA', 'NA', 'NA', 'NA', datetime.datetime(1900, 1, 1, 16, 49)]
max(filter(lambda x: x!= 'NA', l))
0 голосов
/ 13 октября 2018

Возьмите элементы из списка, игнорируя 'NA' и сделайте max():

print(max(x for x in lst if x != 'NA'))
# 1900-01-01 16:49:00

Обратите внимание, что я использовал lst вместо list, потому что он затеняет встроенный список .

0 голосов
/ 13 октября 2018

Вы можете сделать что-то вроде этого:

new_list = [i for i in list if i != 'NA']
print(max(new_list))

Делая это, вы создаете новый список, который будет содержать только элементы datetime, а затем вы можете легко получить максимальное значение с помощью max()function.

Или, если вы вообще не хотите создавать новый список, вы можете просто сделать это:

print(max(i for i in list if i != 'NA'))
0 голосов
/ 13 октября 2018

Вы можете использовать выражение генератора , чтобы исключить элементы, которые вы не хотите сравнивать:

import datetime

lst = [datetime.datetime(1900, 1, 1, 16, 5), 
       'NA', 'NA', 'NA', 'NA', datetime.datetime(1900, 1, 1, 16, 49)]

print(max(item for item in lst if item != 'NA'))

обратите внимание, что list не является хорошей переменнойв питоне.вы перезаписываете встроенный list.

...