Как найти сумму нечетных чисел питон

the question asks to find the sum of odd numbers when given a string of numbers.
so for example, if we are given “123” we should get the sum of 4.

This is my attempt and it returns ‘4’ which is incorrect

def sumoddnum(s):
    total= 0
    for i in range(len(s)):
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

I’ve also tried converting s into integers but it keeps giving me the “int is not iterable” error

def sumoddnum(s):
    total= 0
    s= int(s)
    for i in s:
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

asked Dec 1, 2019 at 7:07

jennyislong's user avatar

This should work for you:

def sumoddnum(s):
  return sum(0 if int(i) % 2 == 0 else int(i) for i in s)

or if you want to keep your first attempt, you should iterate through your str then check the condition on every int of character:

def sumoddnum(s):
    total= 0
    for i in s:
        if int(i) % 2 == 1:
            total += int(i)
    return total 
print(sumoddnum('12345'))

answered Dec 1, 2019 at 7:17

Ayoub's user avatar

AyoubAyoub

1,41714 silver badges24 bronze badges

I like using a regex approach here. We can apply the regex pattern [13579] to the input string, then use a list comprehension on the resulting list of odd digits to find the sum:

num = "123"
odds = re.findall(r'[13579]', num)
sum = sum(int(odd) for odd in odds)
print("the sum is: " + str(sum))

This prints:

The sum is: 4

answered Dec 1, 2019 at 7:24

Tim Biegeleisen's user avatar

Tim BiegeleisenTim Biegeleisen

496k25 gold badges278 silver badges354 bronze badges

Your first approach does not work because what you’re actually adding to the sum are ‘indices’ of s not it’s elements. What could have work is changing your for loop to run over elements instead of their positions. Then keep in mind that elements of a string are characters so a conversion to the int is required. This can be done with built-in int function whenever the character actually represents a digit.

def sumoddnum(s):
    total= 0
    for i in s:
        if int(i) % 2 == 1:
            total += int(i)
    return total 

Now at this point you may wonder

what a long function for such a simple task!

and you’ll be absolutely right. Luckily, Python comes with comprehensions which allow us to shorten some of the for loops and built-in sum function which purpose is kinda self-explanatory but what you need to remember that it takes iterables as its input.

The result you may get will be something like this:

def sumoddnum(s):
    return sum(int(i) for i in s if int(i) % 2 == 1)

With Python 3.8 you can also make use of brand new walrus operator:

def sumoddnum(s):
    return sum(num for i in s if (num := int(i)) % 2 == 1)

The problem with your second approach is already explained by the Python interpreter itself. You’ve converted your string to the integer, and there’s no built-in way too loop over integers. You’ll need to find and implement your own way to loop over integer’s digits (hint: use remainder modulo 10).

answered Dec 1, 2019 at 7:48

Ponewor's user avatar

PoneworPonewor

1012 silver badges5 bronze badges

The reason your program is not working is because of the line:

for i in range(len(str)):

here, you are taking all values of i from 0 to the length of the string (exclusive of length).

This means, you are adding up all the odd numbers from 0 to the length of the String.

Instead do this:

for i in str:

this will give you each character in the string as i. Now:

i = int(i)

will convert it to int.

Finally :

if i%2 == 1: 
    total+=i

the final code will be:

def sumoddnum(s):
    total= 0
    for i in s:
        i = int(i)
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

answered Dec 1, 2019 at 7:54

Ananay Gupta's user avatar

def sumoddnum(s):
    total= 0
    for i in s:
        i = int(i)
        if i % 2 == 1:
            total += i
    return total 
print(sumoddnum('12345'))

if you use ‘range(len(s))’ in for loop instead of ‘s’, it will give you [0,1,2,3,4] which is 0 to length of the ‘12345.

Therefore, it is required to change the range by just s, then it will give you [‘1′,’2′,’3′,’4′,’5’] which is char elements of string ‘12345’.

Don’t forget to change the type of i to int!

answered Dec 1, 2019 at 7:47

MinJae's user avatar

Here is a better and more readable solution:

def add_up(n: str or int):
   if type(n) == str and str(n).isdigit():
       numbers = [int(n) for n in list(n.strip()) if int(n) % 2 != 0]
       return sum(numbers)
   elif type(n) == int:
       numbers = [int(str(n)) for n in list(str(n)) if n % 2 != 0]
       return sum(numbers)
   else:
       return "No digits found to add up"

answered Dec 1, 2019 at 7:42

moh80s's user avatar

moh80smoh80s

7631 gold badge7 silver badges21 bronze badges

1

0 / 0 / 0

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

Сообщений: 24

1

Сумма нечётных чисел

12.02.2019, 14:27. Показов 58727. Ответов 2


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

Кто-нибудь может подсказать как вычислять сумму нечётных чисел диапазона с 0 по 14, используя только if и оператор цикла for?



0



luigration

12 / 9 / 5

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

Сообщений: 205

12.02.2019, 15:23

2

Лучший ответ Сообщение было отмечено Vik1002 как решение

Решение

Цитата
Сообщение от Vik1002
Посмотреть сообщение

Кто-нибудь может подсказать как вычислять сумму нечётных чисел диапазона с 0 по 14, используя только if и оператор цикла for?

Python
1
2
3
4
5
6
7
sum = 0
 
for i in range(0,15):
    if i % 2 != 0:
        sum += i
 
print (sum)

Добавлено через 9 минут
Только лучше не писать как я “sum”, а выбрать другое имя для переменной.



1



Dax

Модератор

Эксперт Python

1353 / 650 / 207

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

Сообщений: 3,054

12.02.2019, 17:56

3

Python
1
2
3
4
5
6
7
8
9
10
import random
def odder():# ф-ция  обработки
    mlist=[i for  i in range(0,15) if i%2==0] # генератором получаем четные числа 
    print(sum(mlist))# суммирукм
    res=mlist# в переменнную
 
    print(res)# на печать
    return res# возррат 
if __name__ == '__main__':
    odder()# вызов обработки

Добавлено через 8 минут

Python
1
2
3
4
5
6
7
8
9
10
import random
def odder():# ф-ция  обработки
    mlist=[i for  i in range(0,15) if i%2!=0] # генератором получаем четные числа 
    print(sum(mlist))# суммирукм
    res=mlist# в переменнную
 
    print(res)# на печать
    return res# возррат 
if __name__ == '__main__':
    odder()# вызов обработки

Для нечетных.



1



Домашнее задание №6#

Warning

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

В рамках домашнего задания №6 от вас требуется решить 13 задач

  1. Чет, нечет;

  2. Сумма элементов;

  3. Числа с цифрой 6;

  4. Список нескрытых файлов;

  5. Попарные суммы элементов двух списков;

  6. Попарные суммы элементов одного списка;

  7. Сумма по строкам;

  8. Сумма по столбцам*;

  9. Диагонали матрицы;

  10. Скалярное произведение;

  11. (l_p) норма;

  12. Счет вверх и вниз;

  13. Итератор по соседним элементам.

На усмотрение студента предлагается решить ещё и задачи из необязательной части.

1. Чет, нечет#

Пусть дан список v положительных целых чисел. С помощью спискового включения сгенерируйте другой список, где каждое четное заменится на строку "even", а нечетное на строку "odd".

def odd_even(v: list[int]) -> list[str]:
    return [
        # ваш код
    ]

numbers = [1, 3, 2]
print(odd_even(numbers)) # ["odd", "odd", "even"]

Сделайте это без применения функций (в том числе и анонимных) внутри спискового включения.

2. Сумма нечетных элементов#

С помощью списковых включений вычислите сумму всех нечетных (по значению) элементов списка.

def sum_odds(v: list[int]) -> int:
    pass

L = [3, 7, 2, 4, 5, 6] 
print(sum_odds(L)) # 15

3. Числа с цифрой 6#

Пусть дан список целых чисел v. С помощью спискового включения оставьте только те числа, в десятичной записи которых есть цифра 6.

def contains_digit_six(v: list[int]) -> list[int]:
    return [
        # ваш код
    ]

v = [5, 6, 15, 51, 16, 61, 66, -5, -6]
print(contains_digit_six(v)) # [6, 16, 61, 66, -6]

4. Список нескрытых файлов#

В Unix-like операционных системах файлы и папки, названия которых начинаются с точки (.), считаются скрытыми. С помощью спискового включения отфильтруйте таковые из результата функции os.listdir.

def nonhidden(path):
    return [
        # ваш код
    ]

5. Попарные суммы элементов двух списков#

Пусть есть два списка чисел (u) и (v). Верните сумму (x_1 + x_2) для каждой возможной пары элементов ((x_1, x_2)), где (x_1in u), а (x_2in v).

def outer_sum(u: list[float], v: list[float]) -> list[float]:
    return [
        # ваш код
    ]

u = [0, 1, 2]
v = [100, 200, 300]
print(outer_sum(u, v)) # [100, 200, 300, 101, 201, 301, 102, 202, 302]

6. Попарные суммы элементов одного списка#

Пусть дан список чисел (v). Найдите ({x + y| x, y in v}).

def choice2_sum(v: list[float]) -> list[float]:
    return [
        # ваш код
    ]

L = [1, 7, 42]
print(choice2_sum(L)) # [2, 8, 43, 8, 14, 49, 43, 49, 84]

7. Сумма по строкам#

Пусть дана прямоугольная матрица чисел matrix в виде списка списков. Верните список сумм каждой из строк этой матрицы (эквивалент np.sum(matrix, axis=1)).

def rowwise_sum(matrix: list[list[float]]) -> list[float]:
    return [
        # ваш код
    ]

matrix = [[1, 2], [3, 4]]
print(rowwise_sum(matrix)) # [3, 7]

8. Сумма по столбцам#

Пусть дана прямоугольная матрица чисел matrix в виде списка списков. Верните список сумм каждой из строк этой матрицы (эквивалент np.sum(matrix, axis=0)).

def columnwise_sum(matrix: list[list[float]]) -> list[float]:
    return [
        # ваш код
    ]

matrix = [[1, 2], [3, 4]]
print(columnwise_sum(matrix)) # [4, 6]

9. Диагонали матрицы#

Пусть дана квадратная матрица чисел matrix в виде списка списков. Напишите два списковых включения, первое из которых возвращает главную диагональ матрицы, а второе побочную.

def major_diagonal(matrix: list[list[float]]) -> list[float]:
    return [ 
        # ваш код 
    ]

def minor_diagonal(matrix: list[list[float]]) -> list[float]:
    return [
        # ваш код
    ]


matrix = [[1, 2], [3, 4]]
print(major_diagonal(matrix)) # [1, 4]
print(minor_diagonal(matrix)) # [2, 3]

10. Скалярное произведение#

Пусть даны два списка чисел (u) и (v). Используя списковое включение, найдите их скалярное произведение.

def dot_product(u: list[float], v: list[float]) -> float:
    pass

u = [1, 2]
v = [3, 4]

print(dot_product(u, v)) # 11

11. (l_p) норма#

В пространстве (l_p) ((pgeq1)) норма вектора (vec{v}=bigl(v_1, ldots, v_n bigr)) определяется формулой

[
|vec{v}| = left(sum_{i=1}^n |v_i|^pright)^{tfrac{1}{p}}.
]

Определите функцию norm вычисляющую (l_p) норму.

def norm(v: list[float], p: float) -> float:
    pass

v = [3, 4]
print(norm(v, 2)) # 5.0

12. Счет вверх и вниз#

Напишите генератор, который считает от 0 до n, а затем в обратном порядке.

def UpAndDown(n: int):
    # ваш код здесь

print(list(UpAndDown(3))) # [0, 1, 2, 3, 2, 1, 0]

13. Итератор по соседним элементам#

Реализуйте итератор/генератор, который позволит итерировать сразу парами соседних элементов, т.е. для списка [A, B, C, D]:

  1. первая итерация A и B — первый и второй элементы списка;

  2. вторая итерация B и C — второй и третий элементы списка;

  3. третья и последняя итерация C и D — третий и четвертый элементы списка.

def prev_next(iterable):
    # ваш код здесь

x = ["A", "B", "C", "D"]
print(list(prev_next(x))) # [("A", "B"), ("B", "C"), ("C", "D")]

Необязательная часть#

Логирующий декоратор#

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

Декоратор, проверяющий тип#

Напишите параметризованный декоратор typed для функций одного аргумента, который бросает исключение TypeError, если функция вызвана с аргументом не того типа, который был указан в декораторе.

def typed(type_):
    # ваш код здесь

@typed(str)
def paint_red(x):
    color_red = "33[91m"
    color_end = "33[0m"
    return "".join([color_red, x, color_end])

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

print(paint_red("Текст красным цветом"))

Note

В IDE и на сайте текст останется исходного цвета.

А вызов этой функции с аргументом другого типа, должен приводить к ошибке.

try:
    paint_red(42)
except TypeError as msg:
    print(msg)
Функция paint_red вызвана с неправильным типом аргумента int. Ожидался тип str.

Если func — имя декорируемой функции, x — имя её аргумента, а type_ — параметр, задающий тип этого аргумента в декораторе, то бросить необходимое исключение можно инструкцией

error_msg = "Функция {} вызвана с неправильным типом аргумента {}. Ожидался тип {}."
raise TypeError(error_msg.format(
    func.__name__,
    type(x).__name__,
    type_.__name__
))

Диапазон действительных чисел#

Реализуйте генератор, который будет аналогичен range, но будет принимать и целые и действительные числа (аналог np.arange). Генератор должен работать для произвольной комбинации значений параметров, в том числе он должен уметь считать задом наперед. Использование этого генератора не должно приводить к бесконечным циклам.

def frange(): # сигнатуру придумайте сами
    # ваш код здесь

print(list(frange(start=1.0, stop=0.0, step=-0.3))) # [1.0, 0.7, 0.4, 0.1]

Итератор по лог файлам#

Предположим, что вы пишите инструмент для анализа log файлов какого-то софта. Часто за время работы программы накапливается много таких файлов. Ниже приведен список файлов в папке лог файлов некого фаервола.

access_log-20210304.bz2  access_log-20210624.bz2  access_log-20211029.bz2  access_log-20211216.bz2
access_log-20210320.bz2  access_log-20210717.bz2  access_log-20211105.bz2  access_log-20211219.bz2
access_log-20210330.bz2  access_log-20210804.bz2  access_log-20211111.bz2  access_log-20211221.bz2
access_log-20210412.bz2  access_log-20210817.bz2  access_log-20211114.bz2  access_log-20211223.bz2
access_log-20210416.bz2  access_log-20210827.bz2  access_log-20211118.bz2  access_log-20211227.bz2
access_log-20210427.bz2  access_log-20210914.bz2  access_log-20211123.bz2  access_log-20220103.bz2
access_log-20210507.bz2  access_log-20210923.bz2  access_log-20211127.bz2  access_log-20220113.bz2
access_log-20210517.bz2  access_log-20210929.bz2  access_log-20211201.bz2  access_log-20220125.bz2
access_log-20210520.bz2  access_log-20211005.bz2  access_log-20211204.bz2  access_log-20220208.bz2
access_log-20210524.bz2  access_log-20211015.bz2  access_log-20211209.bz2  access_log-20220217.bz2
access_log-20210526.bz2  access_log-20211020.bz2  access_log-20211212.bz2
access_log-20210603.bz2  access_log-20211024.bz2  access_log-20211214.bz2

Реализуйте итератор/генератор, который в качестве параметра будет принимать путь к папке и позволит пробежаться по строкам всех файлов в указанной папке так, будто бы это был один большой файл.

vdtes­t
[29K]

4 месяца назад 

Функция вычисления нечётных произведений из таблицы умножения:

def fun():

____s=0 #начальное значение суммы

____for a in range(1,11): # первый сомножитель

____________for b in range(1,11): #второй сомножитель

________________­____p=a*b #произведение

________________­____if p%2==1: #условие нечетности

________________­________s=s+p #сумма произведений

____return s

Вот как выглядит эта функция в системе Python

автор вопроса выбрал этот ответ лучшим

комментировать

в избранное

ссылка

отблагодарить

#Произвадим ввод библиотек математики и рандома
from math import*
from random import*
#Здесь производим вывод надписи на экран и попутно элемент для вычисления
n=int(input("Введите количество элементов в массиве: " ))
#Вводим пустой массив
arr=[]
#Производим ввод массива (я взял массив от -15 до 15)
for i in range(n):
    arr.append(randint(-15,15))
    #Производим показ получившегося массива
print(arr)
min=arr[0]
#Зададим в 2 единицы для вычисления
#Одну из них берем за 0
k=0
j=1
#Пишем условие для j
x=j%2==0
#В последней строке не уверен что она правильная

задан 27 ноя 2021 в 14:30

Dblnya's user avatar

1

Создадим функцию которая принимает на вход массив и выводит сумму нечётных индексов

def odd_sum(a) -> int:
    s = 0
    for i in range(1, len(a), 2):
        s += a[i]
    return s

ответ дан 27 ноя 2021 в 14:55

Soup's user avatar

SoupSoup

3562 серебряных знака12 бронзовых знаков

5

Пишем сумму значений массива в нечетных индексах:

Sum=0
for j in range(n):
    if arr[j]%2==1:
        Sum+=arr[j]
print(Sum)

0xdb's user avatar

0xdb

51.4k194 золотых знака56 серебряных знаков232 бронзовых знака

ответ дан 27 ноя 2021 в 15:42

Dblnya's user avatar

DblnyaDblnya

133 бронзовых знака

Добавить комментарий