Форум сайта python.su
0
Написать функцию 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)
Офлайн
76
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']))
Офлайн
857
Inna90Нет, за один проход надо всё сделать. Если там миллиард элементов, нельзя по ним два раза проходить.
Правильное ли решение?
Офлайн
0
как,за один проход надо всё сделать?
Офлайн
857
Inna90Просто перебираешь элементы.
как,за один проход надо всё сделать?
Офлайн
0
Как просили, за один прогон по списку, плюс от себя добавил проверку по строковому типу на случай ошибки в массиве
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=' ')
Отредактировано Zodt (Окт. 18, 2016 01:20:56)
Офлайн
857
ZodtЧто-то у тебя ошибок много всяких.
Как просили, за один прогон по списку
ZodtДа нет, функция не должна такой ерундой заниматься. Её задача в чём состоит? Чтобы правильно выбрать элементы, и всё. А устранением ошибок должна заниматься функция, чья задача - устранять ошибки, и всё.
плюс от себя добавил проверку по строковому типу на случай ошибки в массиве
ZodtЭто к питону не относится, а больше относится к алгоритму. Какие-то значения с потолка выставляются. Нужно брать начальные значения из первого элемента массива (притом если он есть вообще).h,l = 0,1
>>> copy_min_max([20, 10]) [1, 20] >>> copy_min_max([-20, -10]) [-20, 0] >>>
ZodtНе надо работать со строками. Если там могут быть строчные представления чисел, это должна преобразовать в числовой вид специальная функция снаружи. Поэтому весь этот try … except вообще не нужен здесь. Снаружи должен приходить массив чисел, и всё. Если в массиве есть что-то другое, его сначала должна переделать в массив чисел специальная функция.try: int(j)
ZodtЧтоы это за None? В питоне используется pass как пустой оператор. Потому и надо сначала почитать что-нибудь по питону, где это всё написано на первых страницах.except ValueError: None
ZodtТут сразу три ошибки: во-первых, в одну строку писать не принято в питоне (нарушается читаемость); во-вторых, else здесь не нужен, так как он не используется; в-третьих, как выше сказано уже, нужно использовать pass в таких случаях.if l>j: l = j elif h<j: h = j else: None
[]
[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] >>>
Отредактировано py.user.next (Окт. 18, 2016 02:39:28)
Офлайн
0
Думаю у каждого было такое, что пишешь код ночью, прямо скажем, по наитию и даже не думаешь о том, что пишешь. Сейчас проснулся и, мягко говоря стыдновато за то, что прислал ночью. Однако, я не утверждаю, что представленный вариант ниже будет эталонным.
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')
Отредактировано Zodt (Окт. 18, 2016 19:46:36)
Офлайн
857
>>> 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'] >>>
Офлайн
0
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]))
Офлайн