Найти - Пользователи
Полная версия: copy_min_max/pyton
Начало » Python для новичков » copy_min_max/pyton
1 2
Inna90
Написать функцию copy_min_max(first_list), в качестве аргумента любой список first_list, добавляет (копирует) в новый список second_list наименьший и наибольший элемент из списка first_list и возвращается в конце списка second_list.
Правильное ли решение?
>>> import copy
>>> test_1=
>>> test_2=
>>> test_copy = test_1+test_2
>>> print (test_copy)

>>> max(test_copy), min(test_copy)
(10, 1)
Romissevd
 def copy_min_max(first_list):
    second_list = []
    second_list.append(max(first_list))
    second_list.append(min(first_list))
    return second_list
print(copy_min_max([1, 2, 3, 4, 5]))
print(copy_min_max(['aa', 'vv', 'c']))
py.user.next
Inna90
Правильное ли решение?
Нет, за один проход надо всё сделать. Если там миллиард элементов, нельзя по ним два раза проходить.
Inna90
как,за один проход надо всё сделать?
py.user.next
Inna90
как,за один проход надо всё сделать?
Просто перебираешь элементы.
Если элемент меньше минимального на данный момент, то сохранить его вместо минимального.
Если элемент больше максимального на данный момент, то сохранить его вместо максимального.
В конце останутся правильные элементы.
Zodt
Как просили, за один прогон по списку, плюс от себя добавил проверку по строковому типу на случай ошибки в массиве

 def copy_min_max(a):
    h,l = 0,1
    for j in a:
        try: int(j)
        except ValueError: None
        else:
            j = int(j)
            if l>j: l = j
            elif h<j: h = j
            else: None
    return [l,h]
print(copy_min_max(['10', 'serh', 50, 51, -18]),end=' ')
py.user.next
Zodt
Как просили, за один прогон по списку
Что-то у тебя ошибок много всяких.

Zodt
плюс от себя добавил проверку по строковому типу на случай ошибки в массиве
Да нет, функция не должна такой ерундой заниматься. Её задача в чём состоит? Чтобы правильно выбрать элементы, и всё. А устранением ошибок должна заниматься функция, чья задача - устранять ошибки, и всё.

Давай я тебе объясню один раз, чтобы ты понял, что надо сначала почитать что-нибудь по питону:

1)
Zodt
  
h,l = 0,1
Это к питону не относится, а больше относится к алгоритму. Какие-то значения с потолка выставляются. Нужно брать начальные значения из первого элемента массива (притом если он есть вообще).

Иначе всё это не только не работает, но и вылазит
  
>>> copy_min_max([20, 10])
[1, 20]
>>> copy_min_max([-20, -10])
[-20, 0]
>>>

2)
Zodt
  
try: int(j)
Не надо работать со строками. Если там могут быть строчные представления чисел, это должна преобразовать в числовой вид специальная функция снаружи. Поэтому весь этот try … except вообще не нужен здесь. Снаружи должен приходить массив чисел, и всё. Если в массиве есть что-то другое, его сначала должна переделать в массив чисел специальная функция.

Каждая функция должна заниматься только своим делом. Не должно быть функций, которые одновременно и танцуют, и поют, и подарки раздают.

3)
Zodt
  
except ValueError: None
Чтоы это за None? В питоне используется pass как пустой оператор. Потому и надо сначала почитать что-нибудь по питону, где это всё написано на первых страницах.

4)
Zodt
  
if l>j: l = j
elif h<j: h = j
else: None
Тут сразу три ошибки: во-первых, в одну строку писать не принято в питоне (нарушается читаемость); во-вторых, else здесь не нужен, так как он не используется; в-третьих, как выше сказано уже, нужно использовать pass в таких случаях.

Так что вердикт такой: неправильно у тебя функция работает, потому что алгоритм не учитывает всех возможных поступающих массивов чисел.
Нужно обработать такие массивы
[]
[1]
[2, 1]
[-1, -2]

У тебя же ряд случаев неправильно обрабатывается
  
>>> copy_min_max([])
[1, 0]
>>> copy_min_max([1])
[1, 1]
>>> copy_min_max([2, 1])
[1, 2]
>>> copy_min_max([-1, -2])
[-2, 0]
>>>
Zodt
Думаю у каждого было такое, что пишешь код ночью, прямо скажем, по наитию и даже не думаешь о том, что пишешь. Сейчас проснулся и, мягко говоря стыдновато за то, что прислал ночью. Однако, я не утверждаю, что представленный вариант ниже будет эталонным.

 def rer(j,l,h,a,i):
    try: float(h).is_integer() and float(l).is_integer() and float(j).is_integer()
    except ValueError: 
        if l == str(h):
            a.remove(a[a.index(j)])
            return a[i],a[i],a[i]
        else:
            return l,int(l),int(h)
    else: 
        if float(h).is_integer() and float(l).is_integer() and float(j).is_integer():
            return int(j),int(l),int(h)
        else:
            return float(j),float(l),float(h)
def tyu(a):
    try: h,l = a[0],a[0]
    except IndexError:
        return '',''
    else:
        return a[0],a[0]
    
def new_list(a):
    h,l = tyu(a)
    for i,j in enumerate(a):
        j,l,h = rer(j,l,h,a,i)
        if l>j and i!= 0: l = j
        elif h<j and i!= 0: h = j
    if len(set(a)) == 2 and l == str(h):
                return 'Цифр не обнаружено'
    if l == '' or h == '':
        return 'Дан пустой массив'
    else:
        if l == h: return [l]
        else: return [l,h]
    
print(new_list([]),new_list(['-0.1234567898765432',15, -0.1234567898765433]),new_list(['-12.3',18.5,19]),new_list(['Двадцать одно','Нуль','Двенадцать','Четыре']),new_list(['-12',-11,'11']),new_list([34,'11',76,'Два',13]),new_list([1]),new_list(['Пять',1,6,-1,12,0]),sep='\n')
py.user.next
  
>>> def min_max(seq):
...     it = iter(seq)
...     emin = emax = next(it, None)
...     for e in it:
...         if e < emin:
...             emin = e
...         if e > emax:
...             emax = e
...     return [emin, emax]
... 
>>> min_max([])
[None, None]
>>> min_max([1])
[1, 1]
>>> min_max([2, 1])
[1, 2]
>>> min_max([-1, -2])
[-2, -1]
>>> min_max('defabc')
['a', 'f']
>>>
Zodt
py.user.next, прогони свой код с этим массивом, найдешь ошибку

 def min_max(seq):
        it = iter(seq)
        emin = emax = next(it, None)
        for e in it:
            if e < emin:
                emin = e
            if e > emax:
                emax = e
            return [emin, emax]
print(min_max([-0.1234567898765431,15, -0.1234567898765432]))


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