функция max / min в списке со строками и целыми числами - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть список со строками и целыми числами, и я хочу найти минимальное значение целых чисел без разрезания по списку.Есть ли обходной путь?

arr = [5,3,6,"-",3,"-",4,"-"]    
for i in range(len(set(arr))):
        cut = min(arr)

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

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Вы можете отфильтровать нечисловые значения с помощью выражения генератора:

arr = [5,3,6,"-",3,"-",4,"-"]
result = min(e for e in arr if isinstance(e, int))
print(result)

Выход

3
0 голосов
/ 15 февраля 2019

Вы можете преобразовать list в set, чтобы ускорить вычисления:

min(i for i in set(arr) if isinstance(i, int))

Тест:

setup = "arr = [5, 3, 6,'-', 3,'-', 4, '-'] * 1000"

solution1 = "min(i for i in set(arr) if isinstance(i, int))"
solution3 = "min(e for e in arr if isinstance(e, int))"
solution2 = "min(arr, key=lambda x: (not isinstance(x,int), x))"

print(timeit.timeit(setup=setup, stmt=solution1, number=10000))
print(timeit.timeit(setup=setup, stmt=solution2, number=10000))
print(timeit.timeit(setup=setup, stmt=solution3, number=10000))

Выход:

1.0895615029
13.389633473
22.653398585

Еслиу вас есть только один тип строки:

min(set(arr) - {'-'})
0 голосов
/ 15 февраля 2019

Вот способ использования непосредственно встроенных функций max и min с пользовательскими key:

arr = [5,3,6,"-",3,"-",4,"-"]
max(arr, key=lambda x: (isinstance(x,int), x))
# 6

И аналогично для min:

min(arr, key=lambda x: (not isinstance(x,int), x))
# 3

Подробности

Для минимума рассмотрим следующее понимание списка как «эквивалент» преобразования, примененного с key:

sorted([(not isinstance(x,int), x) for x in arr])

[(False, 3),
 (False, 3),
 (False, 4),
 (False, 5),
 (False, 6),
 (True, '-'),
 (True, '-'),
 (True, '-')]

Таким образом, min будет самым низким кортежем, то есть (0,3).

А для max самым высоким будет (1,6):

sorted([(isinstance(x,int), x) for x in arr])

[(False, '-'),
 (False, '-'),
 (False, '-'),
 (True, 3),
 (True, 3),
 (True, 4),
 (True, 5),
 (True, 6)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...