20
Апр
2018

Вернуть минимум и максимум [дубликат]

Вот такое задание:нужно написать свою реализацию встроенных функций (версии для py3) min и max.

max(arg1, arg2, *args[, key]) or min(arg1, arg2, *args[, key])

Возвращает наибольший (наименьший) элемент в итерируемом (iterable) или наибольшее (наименьшее) из двух и более аргументов.

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

Необязательный ключевой аргумент key определяет функцию одного аргумента, которая используется для извлечения ключа для сравнения из каждого элемента массива (для примера, key=str.lower).

Если массив содержит несколько максимальных (минимальных) значений, то функция возвращает первый по порядку в массиве.

def min(*args, **kwargs):
    key = kwargs.get("key", None)
    return None


def max(*args, **kwargs):
    key = kwargs.get("key", None)
    return None


if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert max(3, 2) == 3, "Simple case max"
    assert min(3, 2) == 2, "Simple case min"
    assert max([1, 2, 0, 3, 4]) == 4, "From a list"
    assert min("hello") == "e", "From string"
    assert max(2.2, 5.6, 5.9, key=int) == 5.6, "Two maximal items"
    assert min([[1, 2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0], "lambda key"
    print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")

Начал решать так:

def max(*args,**args):
    lst=args[0]
    max=lst[0]
    for i in range(len(lst)): 
        if lst[i]>max:
           max=lst[i]
    return max

def min(*args, **kwargs):
    lst=args[0]
    min=lst[0]
    for i in range(len(lst)): 
        if lst[i]<min:
           min=lst[i]
    return min 

Привет!Я посмотрел дубликат ответа.Сделал по тому свою реализацию.Как сделать так чтобы функции поддерживали генераторы,там ошибка при сравнении элементов генератора.

if iterable[i]<min:

TypeError: '<' not supported between instances of 'generator' and 'generator'

def max(*args,**kwargs):
    key = kwargs.get("key", None)
    iterable=None
    max=None
    if isinstance(args[0],int) or isinstance(args[0],float):
        iterable=args 
        max=args[0]
    else:
        iterable=list(args[0])
        max=iterable[0]
    for i in range(len(iterable)):
        if key!= None:
          if key(iterable[i])>key(max):
             max=iterable[i]
        else:
           if iterable[i]>max:
               max=iterable[i]
    return max       

def min(*args, **kwargs):
    key = kwargs.get("key", None)
    iterable=None
    min=None
    if isinstance(args[0],int) or isinstance(args[0],float):
        iterable=args 
        min=args[0]
    else:
        iterable=list(args)
        min=iterable[0]
    for i in range(len(iterable)):
        if key!= None:
          if key(iterable[i])<key(min):
             min=iterable[i]
        else:
           if iterable[i]<min:
               min=iterable[i]
    return min 
    
if __name__ == '__main__':
  print(min(abs(i) for i in range(-10, 10)))#<---File "d:\Python_code\CheckIo\minMax.py", line 62, in min
                           if iterable[i]<min:
                           TypeError: '<' not supported between instances of 'generator' and 'generator'
                           Process terminated with an exit code of 1
 

Вот так решил)

#-*-coding: utf-8 -*-
def min( *args,**kwargs):#*args, **kwargs
    default=None
    key = kwargs.get("key", None)
    if isinstance(args[0],int) or isinstance(args[0],float):
        #print('eto mnogo argum-ov')
        # Если у нас список аргументов, то не церемонимся
        # и начинаем сразу с первого элемента
        result = args[0]
        started = True
        iterable = args
    else:
        # Если у нас iterable первым аргументом, то
        # поцеремонимся и начнём в цикле for (это позволяет
        # избавиться от обращения по индексу)
        result = default
        started = False
        if len(args)==1:
            iterable=args[0]
        else:    
            iterable = args        
        #print('eto spis')
    # Проходимся по элементам iterable-объекта
    for item in iterable:
        if not started:
            # Если первого элемента ещё не существует,
            # то ставим его
            result = item
            started = True
            continue
        # Если предыдущий элемент существует, то сравниваем
        if key!=None:
          if key(item) < key(result):
              result = item
        else:      
          if item<result:
              result = item
              
               
    return result   

def max( *args,**kwargs):#*args, **kwargs
    default=None
    key = kwargs.get("key", None)
    if isinstance(args[0],int) or isinstance(args[0],float):
        #print('eto mnogo argum-ov')
        # Если у нас список аргументов, то не церемонимся
        # и начинаем сразу с первого элемента
        result = args[0]
        started = True
        iterable = args
    else:
        # Если у нас iterable первым аргументом, то
        # поцеремонимся и начнём в цикле for (это позволяет
        # избавиться от обращения по индексу)
        result = default
        started = False
        if len(args)==1:
            iterable=args[0]
        else:    
            iterable = args
        #print('eto spis')
    # Проходимся по элементам iterable-объекта
    for item in iterable:
        if not started:
            # Если первого элемента ещё не существует,
            # то ставим его
            result = item
            started = True
            continue
        # Если предыдущий элемент существует, то сравниваем
        if key!=None:
          if key(item) > key(result):
              result = item
        else:      
          if item > result:
              result=item
               
    return result   



if __name__ == '__main__':
   assert max(3, 2) == 3
   assert  min(3, 2) == 2
   assert  max([1, 2, 0, 3, 4]) == 4
   assert min("hello") == "e"
   assert  max(2.2, 5.6, 5.9, key=int) == 5.6
   assert min([[1,2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0]   
  

Источник: https://ru.stackoverflow.com/questions/816715/%D0%92%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C-%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC-%D0%B8-%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D1%83%D0%BC

Тебе может это понравится...

Добавить комментарий