Как найти наименьшую сумму в питоне

In native Python, min and max have key functions:

>>> LoT=[(1, 2), (3, 4), (5, 6), (7, 8)]
>>> min(LoT, key=sum)
(1, 2)
>>> max(LoT, key=sum)
(7, 8)

If you want the index of the first min or max in Python, you would do something like:

>>> min(((i, t) for i, t in enumerate(LoT)), key=lambda (i,x): sum(x))
(0, (1, 2))

And then peel that tuple apart to get what you want. You also could use that in numpy, but at unknown (to me) performance cost.


In numpy, you can do:

>>> a=np.array(LoT)
>>> a[a.sum(axis=1).argmin()]
array([1, 2])
>>> a[a.sum(axis=1).argmax()]
array([7, 8])

To get the index only:

>>> a.sum(axis=1).argmax()
3

0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 6

1

Определить последовательность с минимальной суммой элементов

29.01.2016, 19:56. Показов 3045. Ответов 5


Студворк — интернет-сервис помощи студентам

выручайте,буду долженн((
Мальчик подошел к платной лестнице. Чтобы наступить на любую ступеньку, нужно заплатить указанную на ней сумму. Мальчик умеет перешагивать на следующую ступеньку, либо перепрыгивать через ступеньку. Требуется узнать, какая наименьшая сумма понадобится мальчику, чтобы добраться до верхней ступеньки.

Входные данные
В первой строке входного файла вводится одно натуральное число N100 — количество ступенек.
В следующей строке вводятся N натуральных чисел, не превосходящих 100 — стоимость каждой ступеньки (снизу вверх).

Выходные данные
Выведите одно число — наименьшую возможную стоимость прохода по лесенке.

Примеры
входные данные
3
1 3 1
выходные данные
2



0



Marinero

Эксперт NIX

2793 / 2036 / 682

Регистрация: 02.03.2015

Сообщений: 6,509

29.01.2016, 22:52

2

Python
1
2
3
4
5
6
7
8
9
10
11
12
n = int(input())
steps = [int(i) for i in input().split()]
s = 0
i= 0
 
while i < 2:
    if steps[i+1] <= steps[i]:
        i += 1
    s += steps[i]
    i += 1
else:
    print(s)



0



YakobsEA

268 / 96 / 75

Регистрация: 04.12.2015

Сообщений: 369

Записей в блоге: 1

30.01.2016, 12:14

3

Не, не, не… Это работает только для частного случая с тремя ступеньками. А у нас

Цитата
Сообщение от Евгений211
Посмотреть сообщение

В первой строке входного файла вводится одно натуральное число N100 — количество ступенек.

Тут алгоритм другой должен быть…

Добавлено через 8 часов 20 минут
Вот это, кажется, ближе к истине:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"""Чтение исходных данных и инициализация переменных""" 
f = open('D:\TMP\data1.txt', 'r')
l = 0
for line in f:
    l += 1  
    if l == 1: n = int(line)
    elif l == 2: steps = [int(i) for i in line.split()]
f.close()
s = 0
i = -1
 
"""Расчёт""" 
while 1:
    if n-i-1 > 2:
        if steps[i+1] + steps[i+3] > steps[i+2]:
            if n-i-1 > 4:
                if (steps[i+3] + steps[i+5] <= steps[i+4]) and steps[i+1] <= steps[i+2]:
                    pass
                else: i += 1
            else: i += 1
    elif n-i-1 == 2:
        if steps[i+1] > steps[i+2]: i += 1
    else: break
 
    i += 1
    s += steps[i]
    print("№ ступеньки (начиная с 1-й): " + str(i+1) + ". Стоимость шага: " + str(steps[i]) + ", стоимость пути: " + str(s))
 
print("Минимальная сумма, на которую обдерут пацана: " + str(s))

Верю, что это можно сделать короче, использовав специализированные библиотеки и глубокие знания языка. К сожалению «моя питон хуже твоя питон». Пока я только так умею.



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 6

30.01.2016, 12:47

 [ТС]

4



0



268 / 96 / 75

Регистрация: 04.12.2015

Сообщений: 369

Записей в блоге: 1

30.01.2016, 15:18

5

Что именно не проходит?
Мог и не учесть что-нибудь, конечно.
Представьте пример с данными, который неправильно обрабатывается.
К стати, забыл сказать, что у меня в программе нет проверки на корректность исходных данных, так что будте внимательны. Первое число должно быть в первой строке, набор весов ступенек должен быть во второй строке файла. Веса должны быть разделены одним пробелом и их количество не должно быть меньше числа из первой строки.
И писал в питон 2.3 — это тоже может повлиять теоретически (хотя вряд ли).

Добавлено через 14 минут
Не понимаю, там вручную что-ли кто-то проверяет работоспособность?
Дошлите им файл data1.txt следующего содержания:
8
1 2 1 1 3 3 6 1
Поясните, что путь к файлу нужно изменить…



0



0 / 0 / 0

Регистрация: 29.01.2016

Сообщений: 6

30.01.2016, 15:38

 [ТС]

6

всем спасибо, я решил )



0



С клавиатуры вводится кол-во элементов массива и сам массив чисел. Размер массива не больше 100 элементов. Нужно вывести элемент с минимальной суммой цифр в одну строку(если таких несколько, вывести минимальный из них). А во вторую, элемент с максимальной суммой цифр(если таких несколько, вывести максимальный из них)

В примере ниже: 11(1+1=2); 21(2+1=3); 111(1+1+1=3), 2-минимальная сумма, 3-максимальная, но т.к. элементов с суммой цифр равной 3м-два, то выводится максимальный из них т.е. 111

Подскажите, пожалуйста, алгоритм действий, поскольку у меня даже нет идей как выполнить поставленную задачу

Я знаю как найти сумму цифр числа, но как из массива взять число для проверки(и при этом, в случае если чисел с минимальной/максимальной суммой несколько, определить какое из них стоит выводить)-не понимаю

Пример

Вход

3

11 21 111

Выход

11

111

Как рассчитать минимальную сумму элементов в матричном питоне? например:

z = 
np.array([[1, 2, 3], 

 [3, 2, 5], 

 [2, 4, 4]])

Минимальная сумма элемента: 1 + 2 + 2 = 5

Я устал:

def calculate(a):
    sum = 0
    for i in range(len(a)):
        sum += np.sum(a[i])

    return sum

Но это дает мне 26 вместо 5

7 ответов

Лучший ответ

Вы добавляете сумму всей строки к сумме, когда вы должны добавить минимальное значение. Так что просто замените sum на min:

z = np.array([[1, 2, 3], [3, 2, 5], [2, 4, 4]])

def calculate(a):
    sum = 0
    for row in a:
        sum += np.min(row)
    return sum

print(calculate(z))

>>> 5

Я также оптимизировал ваш метод цикла, чтобы быть более понятным.


1

Mandera
1 Июн 2020 в 11:34

Итак, вы z в качестве следующего массива. В NumPy вы должны понимать axis массива: (пожалуйста, посмотрите этот ответ для лучшего умственного образа: очень базовая-numpy-массив-измерение-визуализация). Итак, массив здесь 2D.

#----> axis: 1      #| a
array([[1, 2, 3],   #| x
       [3, 2, 5],   #| i
       [2, 4, 4]])  #| s
                    #v 0

Итак, мы находим минимум вдоль axis 1

In [70]: np.min(z, axis=1) 
Out[70]: array([1, 2, 2])

А так как вам также нужна сумма, вы вызываете .sum() для результирующего 1D массива из вышеприведенного шага. Ниже приведен код в одной строке:

In [71]: np.min(z, axis=1).sum()   
Out[71]: 5

Общее практическое правило заключается в том, чтобы не использовать циклы for с массивами NumPy, поскольку это будет очень медленно (с точки зрения времени выполнения).


0

kmario23
1 Июн 2020 в 17:08

Вы можете использовать np.min(): —

z = np.array([[1,2,3],[3,2,5],[2,4,4]])
res = sum(np.min(z, axis=1))
print(res)

Выход:

5


1

Dhaval Taunk
1 Июн 2020 в 11:38

Вы не должны использовать циклы for для выполнения операций с массивами Numpy. Numpy существует, чтобы предоставлять оптимизированные альтернативы циклам, и использование циклов побеждает эту цель. Вы можете взять минимальное значение каждой строки (сворачивая первую ось), а затем суммировать получающиеся три значения:

np.sum(np.min(z, axis=1))
Out[61]: 5


3

Nicolas Gervais
1 Июн 2020 в 14:34

Вы можете применить функцию, чтобы найти минимальное значение для каждой строки и сумму после этого.

import numpy as np
z = np.array([[1, 2, 3], 
             [3, 2, 5], 
             [2, 4, 4]])

np.apply_along_axis(np.min,-1,z).sum()

Как это работает? Сначала вы определяете функцию. Нахождение минимального значения, в этом случае. Во-вторых, вы определяете ось, которую вы хотите найти вам значения. Смотрите полное описание в документации ниже. Ласли я запускаю .sum (), чтобы суммировать все элементы. Для учебных целей я предлагаю только бег

np.apply_along_axis(np.min,-1,z)

Подробнее читайте в документации Numpy


1

pinegulf
1 Июн 2020 в 11:41

Вы найдете np.min над осью 1.

z = np.array([[1, 2, 3], [3, 2, 5], [2, 4, 4]])
z.min(1).sum()
# 5


1

Ch3steR
1 Июн 2020 в 11:38

Пытаться:

min_sum = sum(map(np.min,z)) 
print(min_sum) # output: 5


1

Gabip
1 Июн 2020 в 11:39

python.
Напишите программу, которая находит в матрице строку с минимальной суммой.
Входные данные
В первой строке записаны через пробел размеры матрицы: количество строк N и количество
столбцов M (1 ≤ N, M ≤ 100 ). В следующих N строках записаны строки матрицы, в каждой
– по M натуральных чисел, разделённых пробелами.
Выходные данные
Программа должна вывести все элементы найденной строки с минимальной суммой,
разделив их пробелами. Если строк с одинаковой минимальной суммой несколько, нужно
выбрать из них строку с минимальным индексом.
Примеры
Входные данные
4 5
1 3 2 54 234
75 12 3 46 9
13 26 56 9 12
14 90 897 6 34
Выходные данные
13 26 56 9 12

Понравилась статья? Поделить с друзьями:
  • Как найти родословную щенка
  • Как составить название для курса
  • Портрет клиентов b2b как составить
  • Как найти левые почты
  • Как найти прямой угол для фундамента