Форум сайта python.su
Подскажите, можно ли было решить задачу более эффективно? Если да, то как?
Дано четырехзначное число. Поменяйте местами наименьшую и наибольшую цифры.
lst = list('1812') newlst = [] a = max(lst) b = min(lst) for i in range(len(lst)): if a == lst[i]: newlst.insert(i, b) else: newlst.append(lst[i]) # ['1', '1', '1', '2'] for i in range(len(lst)): if b == lst[i]: del newlst[i] newlst.insert(i, a) break result = '' for st in newlst: # Преобразование списка в строку result += st print(int(result)) # 8112
Офлайн
это жесть
вы определили масксимальную цифру и минимальную, зачем вам после этого ТРИ!!! цикла?
c = "123413" max_ = max(c) min_ = min(c) res = [] change_min = change_max = False for i in c: if i == min_ and not change_min: res.append(max_) change_min = True elif i == max_ and not change_max: res.append(min_) change_max = True else: res.append(i) print("".join(res))
Офлайн
FishHook
да, так лучше, спасибо!
Офлайн
Подскажите еще одну задачу. Правильное решение, или можно лучше решить?
Даны числа h и m, где h - количество часов, m - количество минут некоторого момента времени. Найдите угол между часовой и минутной стрелками в этот момент времени.
h = int(input("h ")) m = int(input("m ")) h *= 5 if m > h: print((m - h)*6) else: print(360+(m - h)*6)
Отредактировано Franek (Ноя. 6, 2017 19:07:06)
Офлайн
1)
>>> s = list("1812") >>> s[s.index(max(s))], s[s.index(min(s))] = s[s.index(min(s))], s[s.index(max(s))] >>> "".join(s) '8112'
>>> h = 3 >>> m = 45 >>> h *= 360/12 >>> m *= 360/60 >>> h - m -180
Офлайн
Rodegast
спасибо. (Про index совсем забыл).
Офлайн
Помогите, пожалуйста. Можно ли было улучшить решение задачи? Если да, то как?
Вывести все пятизначные числа, которые делятся на 2, у которых средняя цифра нечетная,
# и сумма всех цифр делится на 4.
def func(number): n = str(number)[2] # Проверка четности средней цифры и числа if int(n) % 2 == 0 or number % 2 != 0: return False total = 0 for i in str(number): # Проверка суммы цифр числа total += int(i) return total % 4 == 0 print(list(filter(func, range(10000, 99999))))
Отредактировано Franek (Ноя. 10, 2017 12:14:50)
Офлайн
FranekЗдесь неправильно то, что ты с числами работаешь как со строками. С числами надо работать числовыми методами, так как они быстрее во много раз и меньше памяти тратят.
Можно ли было улучшить решение задачи?
Офлайн
py.user.next
Я использовал преобразование числа в строку, т. к. для получения суммы цифр используется срез каждой цифры или sum. Срез числа сделать нельзя, во втором случае требует итерируемый объект, а число им не является.
Офлайн
py.user.next
Наверное так?
def func(number): if number % 2 == 0: n = 0 for i in range(5): if i == 2 and (number % 10) % 2 == 0: return False n += (number % 10) number = number // 10 return n % 4 == 0 return False print(list(filter(func, range(10000, 99999))))
Офлайн