Найти - Пользователи
Полная версия: Поиск количества макс. и мин. элементов в списке
Начало » Python для новичков » Поиск количества макс. и мин. элементов в списке
1 2 3
Budulianin
py.user.next
за один проход это можно выполнить без всяких max и min
Покажи =)
py.user.next
Budulianin
Покажи =)
с удовольствием! :)

>>> def f(lst):
...     emin = emax = lst[0]
...     nmin = nmax = 1
...     ind = {'min': [0], 'max': [0]}
...     for i in range(1, len(lst)):
...         e = lst[i]
...         if e < emin:
...             emin, nmin = e, 1
...             ind['min'] = [i]
...         elif e == emin:
...             nmin += 1
...             ind['min'].append(i)
...         if e > emax:
...             emax, nmax = e, 1
...             ind['max'] = [i]
...         elif e == emax:
...             nmax += 1
...             ind['max'].append(i)
...     return (emin, nmin, ind['min']), (emax, nmax, ind['max'])
... 
>>> f([1, 2, 3, 1, 2, 3, 1, 3, 1, 3, 1, 1, 3, 3, 1])
((1, 7, [0, 3, 6, 8, 10, 11, 14]), (3, 6, [2, 5, 7, 9, 12, 13]))
>>> f([1])
((1, 1, [0]), (1, 1, [0]))
>>> f([1, 1])
((1, 2, [0, 1]), (1, 2, [0, 1]))
>>> f([1, 1, 2])
((1, 2, [0, 1]), (2, 1, [2]))
>>>
Budulianin
И что
Это лучше чем

lst_min = [index for index, value in enumerate(lst) if value == min(lst)]
?

Чем? Ресурсов меньше ест ?
py.user.next
#!/usr/bin/env python3
 
import timeit
 
def f1(lst):
    lst_min = [index for index, value in enumerate(lst) if value == min(lst)]
    lst_max = [index for index, value in enumerate(lst) if value == max(lst)]
    return (min(lst), len(lst_min), lst_min), (max(lst), len(lst_max), lst_max)
 
def f2(lst):
    emin = emax = lst[0]
    nmin = nmax = 1
    ind = {'min': [0], 'max': [0]}
    for i in range(1, len(lst)):
        e = lst[i]
        if e < emin:
            emin, nmin = e, 1
            ind['min'] = [i]
        elif e == emin:
            nmin += 1
            ind['min'].append(i)
        if e > emax:
            emax, nmax = e, 1
            ind['max'] = [i]
        elif e == emax:
            nmax += 1
            ind['max'].append(i)
    return (emin, nmin, ind['min']), (emax, nmax, ind['max'])
 
t1 = timeit.Timer('f1([2, 5, 10, 4, 4, 1, 7, 23, 12, 32, 44, 1, 5, 8, 44, 2, 13, 44])', 'from __main__ import f1')
t2 = timeit.Timer('f2([2, 5, 10, 4, 4, 1, 7, 23, 12, 32, 44, 1, 5, 8, 44, 2, 13, 44])', 'from __main__ import f2')
print(t1.repeat(3, 1000))
print(t2.repeat(3, 1000))

[guest@localhost minmax]$ ./timecmp.py 
[0.03950845999952435, 0.03923851000035938, 0.04115687200010143]
[0.008653074999529053, 0.008569304999582528, 0.008533624999472522]
[guest@localhost minmax]$


Budulianin
Ресурсов меньше ест ?
по ресурсам одно и то же примерно, а по времени однопроходная в тридцать раз быстрее

add
#!/usr/bin/env python3
 
import timeit
 
def f1(lst):
    emin = emax = lst[0]
    nmin = nmax = 1
    ind = {'min': [0], 'max': [0]}
    for i in range(1, len(lst)):
        e = lst[i]
        if e < emin:
            emin, nmin = e, 1
            ind['min'] = [i]
        elif e == emin:
            nmin += 1
            ind['min'].append(i)
        if e > emax:
            emax, nmax = e, 1
            ind['max'] = [i]
        elif e == emax:
            nmax += 1
            ind['max'].append(i)
    return (emin, nmin, ind['min']), (emax, nmax, ind['max'])
 
def f2(lst):
    mine, maxe = min(lst), max(lst)
    lst_min = [index for index, value in enumerate(lst) if value == mine]
    lst_max = [index for index, value in enumerate(lst) if value == maxe]
    return (mine, len(lst_min), lst_min), (maxe, len(lst_max), lst_max)
 
t1 = timeit.Timer('f1([2, 5, 10, 4, 4, 1, 7, 23, 12, 32, 44, 1, 5, 8, 44, 2, 13, 44])', 'from __main__ import f1')
t2 = timeit.Timer('f2([2, 5, 10, 4, 4, 1, 7, 23, 12, 32, 44, 1, 5, 8, 44, 2, 13, 44])', 'from __main__ import f2')
print(t1.repeat(3, 10000))
print(t2.repeat(3, 10000))

[guest@localhost minmax]$ ./timecmp.py 
[0.08802562800002534, 0.08860798599999953, 0.08851004199999579]
[0.08316544199999498, 0.08345718800001123, 0.08323813999999174]
[guest@localhost minmax]$

переделал, заменив повторное вычисление
одинаково по скорости
GGnoob
Сколько петросянов развелось-то . А ответившим по теме спасибо!
Budulianin
Решаемо!

def f1(lst):
    min_item = min(lst)
    max_item = max(lst)
    lst_min = [index for index, value in enumerate(lst) if value == min_item]
    lst_max = [index for index, value in enumerate(lst) if value == max_item]
    return (min_item, len(lst_min), lst_min), (max_item, len(lst_max), lst_max)


[0.011781974961087217, 0.011604104840549188, 0.011442189847102605]
[0.029058422947963833, 0.013951281314891567, 0.01294610830813013]

Теперь вариант в Python стиле даже быстрее

py.user.next
однопроходная в тридцать раз быстрее
Теперь один раз проходим, не считая вычислений max и min по одному разу
py.user.next
Budulianin
Теперь вариант в Python стиле даже быстрее
я там обновил
не сказать, что это быстрее, одно и то же (смотри на старшие цифры)
в моей время уходит на интерпретацию тела функции (создание словаря, вызовы методов __getitem__ и append)

хотя на списках типа
[1, 1, 1]
его версия быстрее в два раза
smoke853
FishHook, вы меня просто в краску вогнали этими картинками с хиромантией
py.user.next, ну я понял теперь, что нужно было min(lst), max(lst) - присвоить переменным, т.к. работает быстрее

У меня вот такие подсчеты получились:
http://savepic.su/3374710.jpg
Budulianin
py.user.next
не сказать, что это быстрее, одно и то же (смотри на старшие цифры)

Если бы даже твой алгоритм был быстрее, то зачем так писать на Python ?
py.user.next
Budulianin
Если бы даже твой алгоритм был быстрее, то зачем так писать на Python ?
во-первых, питон - не единственный язык, который существует, а когда пишешь что-нибудь, хорошо, если есть уже готовая функция, пусть и на другом языке
во-вторых, если что-то работает эффективнее по памяти и скорости, то лучше использовать это, а не что-то более красивое
главное, чтобы код был понятным (в непонятном коде сложно найти ошибку, если она там есть)

smoke853
У меня вот такие подсчеты получились:
ага, я что-то не просёк это в первый раз
в f2(), во включении min и max повторно вычисляются
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB