Я новичок в Python. У меня есть список значений, таких как data = [100,50,3,205,10], и я пытаюсь написать одну функцию, которая будет получать минимальное и максимальное значение в кортеж без использования функции min, max

Вот мой код, и когда я выполняю это, я получаю ма, значения mi (3,3) - которые являются неправильными.

Передача данных в функцию findmax

def findmax(data):
    a = data
    ma = a[0]
    mi = a[len(a)-1]
    k = 0
    while k != len(a):
        for i in range(0,len(a)):
            k = i+1
            if ma > a[i]:
                ma = a[i]
            continue
        for l in range(0,len(a)):
            if mi > a[l]:
                mi = a[l]
     print (ma,mi)

Печать ( findmax ( [ 100,50,3,205,10 ] ) )

1
Rahul 5 Июл 2019 в 23:53

7 ответов

Лучший ответ

Это может быть полезно. Нет необходимости дважды зацикливать входные данные.

data = [100,50,3,205,10] 

def minmax(data):
    _min = data[0]
    _max = data[0]
    for i in range(len(data)):
        if _min > data[i]:
            _min = data[i]
        if _max < data[i]:
            _max = data[i]
    return (_min, _max)
2
BramAppel 5 Июл 2019 в 20:58

Вы можете сделать это в одну строку, хотя и очень неэффективно, с пониманием сортировки и списка

minmax = [ (s[0],s[-1]) for s in [sorted(data)] ]

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

minValue,maxValue = (data[:1] or [None])*2
for value in data[1:]:
    minValue = value if value < minValue else minValue
    maxValue = value if value > maxValue else maxValue
-1
Alain T. 5 Июл 2019 в 21:58

Цикл приветствия, если в вашем списке много элементов, может отнять ваше вычислительное время. Я предлагаю вместо этого сделать это в пандах

import pandas as pd

Затем создайте DataFrame, используя ваши данные:

df = pd.DataFrame({'Values':data})

Используя этот код, вы получите максимальное значение: {{Х0}}

Ты получишь:

205

Надеюсь это поможет :))

-1
Joe 5 Июл 2019 в 21:16

Вот другой подход к нахождению минимального и максимального значения за один проход, считывая значения по два за раз. Вместо выполнения 2 сравнений на элемент, он выполняет 3 для каждых 2 элементов. При этом также используется итератор для перемещения по вводу и zip_longest для просмотра списка попарно:

from itertools import zip_longest

def minmax(data):
    it = iter(data)
    _min = _max = next(it)
    for a, b in zip_longest(it, it, fillvalue=_min):
        if a > b:
            # swap items to make a <= b
            a, b = b, a
        if  a < _min:
            _min = a
        if b > _max:
            _max = b
    return _min, _max

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

0
PaulMcG 7 Июл 2019 в 03:11

Вот интересный способ сделать это с помощью битхака, однако любые улучшения производительности, которые вы увидите из чего-то подобного, настолько незначительны, что компромисс между удобочитаемостью и производительностью не имеет смысла.

def findminmax(data):
    mi = ma = data[0]
    for value in data:
        mi = value if mi ^ ((value^mi) & -(value < mi))
        ma = value if value ^ ((ma^value) & -(ma < value))
    return mi, ma
0
Duncan McFarlane 6 Июл 2019 в 00:47
def minmax(ls):
    if len(ls) == 0:
        return None, None # or some default val
    mini = maxi = ls[0]
    for val in ls[1:]:
        if val < mini:
            mini = val
        elif val > maxi:
            maxi = val
    return mini, maxi

Это обрабатывает случай, когда длина входного списка равна 0. Кроме того, я думаю, что наличие if-else-if имеет больше смысла, потому что если значение меньше минимального, тогда нет смысла выполнять следующую проверку.

1
absolutelydevastated 5 Июл 2019 в 21:11

Вы сможете просмотреть список только один раз и сохранить минимальные и максимальные значения.

data = [100,50,3,205,10]

def findmax(data):
    a = data
    ma = a[0]
    mi = a[0]

    for item in data:
        if item > ma:
            ma = item

        if item < mi:
            mi = item

    return (ma,mi)

print(findmax(data))
0
R7G5 5 Июл 2019 в 21:02