Найти - Пользователи
Полная версия: Подскажите, можно ли улучшить решение задачи?
Начало » Python для новичков » Подскажите, можно ли улучшить решение задачи?
1 2
Franek
Подскажите, можно ли было решить задачу более эффективно? Если да, то как?
Дано четырехзначное число. Поменяйте местами наименьшую и наибольшую цифры.
 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
FishHook
это жесть
вы определили масксимальную цифру и минимальную, зачем вам после этого ТРИ!!! цикла?

 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))
Franek
FishHook
да, так лучше, спасибо!
Franek
Подскажите еще одну задачу. Правильное решение, или можно лучше решить?
Даны числа 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)
Rodegast
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'
2)
 >>> h = 3
>>> m = 45
>>> h *= 360/12
>>> m *= 360/60
>>> h - m
-180
Franek
Rodegast
спасибо. (Про index совсем забыл).
Franek
Помогите, пожалуйста. Можно ли было улучшить решение задачи? Если да, то как?
Вывести все пятизначные числа, которые делятся на 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))))
py.user.next
Franek
Можно ли было улучшить решение задачи?
Здесь неправильно то, что ты с числами работаешь как со строками. С числами надо работать числовыми методами, так как они быстрее во много раз и меньше памяти тратят.
Нужно просто использовать операции // и %.
Franek
py.user.next
Я использовал преобразование числа в строку, т. к. для получения суммы цифр используется срез каждой цифры или sum. Срез числа сделать нельзя, во втором случае требует итерируемый объект, а число им не является.
Franek
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))))
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