Как найти отрицательные числа в массиве python

Есть такое задание:

Запросить ввод k чисел. Вводить можно отрицательные, положительные
числа, ноль. Числа могут повторяться. Найти количество отрицательных
чисел среди вводимых. Вывести ответ с пояснением.

В программе используется оператор цикла for, оператор проверки условия if
Вот код, до которого я дошел:

k = int(input('Введите любое число '))
a = 0
for k in range(k, 1):
 if k < 0:
   print(k)

Как это сделать правильно?

Jack_oS's user avatar

Jack_oS

12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков

задан 20 апр 2021 в 7:39

WaP1's user avatar

2

Вам для “найти количество отрицательных” нужен какой-то счетчик этих самых “отрицательных”, negatives в данном случае (или а, как у вас), который при выполнении условия нужно увеличивать на 1, а после цикла – вывести его на печать:

k = int(input('Количество чисел: '))

negatives = 0
for _ in range(k):
    num = int(input(f'Введите {_+1}-е число: '))
    if num < 0:
        negatives += 1

print(f'Вы ввели {negatives} отрицательных чисел')

ответ дан 20 апр 2021 в 7:45

Jack_oS's user avatar

Jack_oSJack_oS

12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков

1

Функциональным стилем в одну строку чисто по приколу:

print('Отрицательных чисел:', sum(map(lambda x: int(input('Введите число: ')) < 0, range(int(input('Введите количество чисел: '))))))

ответ дан 20 апр 2021 в 8:29

CrazyElf's user avatar

CrazyElfCrazyElf

65.4k5 золотых знаков19 серебряных знаков50 бронзовых знаков

a = 0
for i in range(int(input('Введите любое число: '))):
    a += int(input()) < 0
print(a)

ответ дан 20 апр 2021 в 7:46

Kuchizu's user avatar

KuchizuKuchizu

1,1986 серебряных знаков13 бронзовых знаков

1

Recursive

As others have pointed out you should not use recursion for this kind of thing in a production application as it consumes much more resources for the call stack (which is also limited in Python), but if you want to use it for training purposes you can do it like this.

You need two simple base cases here:

  • List is empty: return True as there cannot be negative values in an empty list
  • List has at least one value and the value is smaller than 0: return False as then we have found a value which is negative in the array

In all other cases we just call the function recursively and return the result.

lst1 = [1, 0, -7, 8, 21]
lst2 = [1, 0, 234, 2342, 23423, 32, 324, 8, 21]


def check_has_negative_rec(arr):
    """
    Checks recursively whether a list contains a negative element or not.
    :param arr: list to check
    :return: True, if list contains negative element, False otherwise
    """
    if len(arr) == 0:
        return False
    elif arr[0] < 0:
        return True
    else:
        return check_has_negative_rec(arr[1:])


print(check_has_negative_rec(lst1))
print(check_has_negative_rec(lst2))

Expected output:

True
False

Iterative

Here how you would do it the iterative way.

lst1 = [1, 0, -7, 8, 21]
lst2 = [1, 0, 234, 2342, 23423, 32, 324, 8, 21]

def check_has_negative_iter(arr):
    for no in arr:
        if no < 0:
            return True
    return False

print(check_has_negative_iter(lst1))
print(check_has_negative_iter(lst2))

Built-in

You can also use Python built-in any() which would make your code more pythonic.

lst1 = [1, 0, -7, 8, 21]
lst2 = [1, 0, 234, 2342, 23423, 32, 324, 8, 21]

def check_has_negative_builtin(arr):
    return any(no < 0 for no in arr)

print(check_has_negative_builtin(lst1))
print(check_has_negative_builtin(lst2))

All three will give you the same result.

0 / 0 / 0

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

Сообщений: 48

1

Написать функцию определения, есть ли в одномерном массиве отрицательные числа

15.04.2021, 13:42. Показов 1925. Ответов 3


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

Написать функцию определения, есть ли в одномерном массиве
отрицательные числа. В матрице A(n,m) найти отрицательные элементы,
лежащие ниже главной диагонали.
НА ПИТОНЕ
помогите . буду благодарен
спасибо.



0



GorodetskiyKP

137 / 95 / 48

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

Сообщений: 234

15.04.2021, 13:59

2

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random
from pprint import pprint
 
 
n = 5
m = 5
A = [[random.randint(-100, 100) for _ in range(m)] for _ in range(n)]
 
negative = []
for row_num, row in enumerate(A):
    for col_num, item in enumerate(row):
        if col_num < row_num and item < 0:
            negative.append(item)
 
pprint(A)
print(len(negative))



0



Эксперт Python

4607 / 2028 / 359

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

Сообщений: 10,085

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

15.04.2021, 17:12

3

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

есть ли в одномерном массиве
… В матрице A(n,m)

Вы уж опреределитесь, в одномерном или в матрице.



0



Dax

Модератор

Эксперт Python

1353 / 650 / 207

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

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

15.04.2021, 20:06

4

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

Решение

В массиве:

Python
1
2
3
4
5
6
7
8
9
10
11
import random
 
 
def masgen(n):
    mlist = list(random.randint(-50, 10) for i in range(n))
    print(*mlist)
    print(list(i for i in mlist if i > 0))
 
 
if __name__ == '__main__':
    masgen(n=16)

Добавлено через 19 минут
Матрица

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy 
 
 
def masgen():
    a = numpy.random.randint(-10,40,(8,8))
    print(a)
    res=numpy.where(a>0)
    print(res)
 
 
 
    
 
if __name__ == '__main__':
    masgen()



0



Пускай имеется такая задача: дан список с численными элементами. Требуется найти и вернуть первый отрицательный элемент. Казалось бы, должна быть какая-нибудь встроенная функция для этого, но нет. Придется писать ее самим. Решение в лоб:

items = [1, 3, 5, -17, 20, 3, -6]

for x in items:
    if x < 0:
        print(x)
        break
else:
    print('not found')

Такое решение работает, но выглядит скорее по-бейсиковски, нежели чем по-питоновски. Пытаясь проявить смекалку, некоторые извращаются и пишут так:

result = list(filter(lambda x: x < 0, items))[0]
print(result)

По-моему, стало гораздо сложнее, хоть и в одну строку. А может лучше так:

result = [x for x in items if x < 0][0]

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

Правильное решение

Лучше использовать встроенную функцию next – она возвращает следующий элемент из итератора, а в качестве итератора мы напишем генераторное выражение с if. Вот так:

result = next(x for x in items if x < 0)

Вот это коротко, экономно и очень по-питоновски (in a pythonic way). Остается одна проблемка: если элемент не найден, что будет брошено исключение StopIteration. Чтобы подавить его, достаточно вторым аргументом в next передать значение по-умолчанию. Если оно задано, то оно будет возвращено вместо возбуждения исключения, если в итераторе нет элементов, то есть не найдено удовлетворяющих условию элементов в исходной коллекции. И не забыть обернуть генераторное выражение в скобки:

items = [1, 2, 4]
result = next((x for x in items if x < 0), 'not found')
print(result)  # not found

С произвольной функцией, задающей критерий поиска (ее еще называют предикат – predicate) это выглядит так:

def is_odd(x):
    return x % 2 != 0

result = next(x for x in items if is_odd(x))
# или еще лучше
result = next(filter(is_odd, items))

Так как в Python 3 filter работает лениво, как и генератор, она не «обналичивает» весь исходный список через фильтр, а лишь идет до первого удачно-выполненного условия. Любите итераторы! ✌️ 

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈 

3 319

Bibi Bakala



Мыслитель

(5082),
закрыт



2 года назад

For i in range(1, 11)
x = int(input())
mx = 0
s = 0
for i in range(1,11):
x = int(input())
if x > mx:
mx = x
print(mx)

Мне тут нужно, чтобы он нашел максимальное ОТРИЦАТЕЛЬНОЕ число

Alexandr

Мудрец

(11943)


2 года назад

”’Подразумевается, что во входном потоке есть хотя бы одно отрицательное число.”’
mx = 0
for i in range(1, 11):
____x = int(input())
____if x < 0:
________mx = x
________break

for i in range(i + 1, 11):
____x = int(input())
____if x < 0 and x > mx:
________mx = x

print(mx)

Упуаут

Оракул

(66595)


2 года назад

загони все числа в список, подключи import statistics там есть поиск минимума

Bibi BakalaМыслитель (5082)

2 года назад

Как? Прошу помогите! Я не дошел до темы списков (
Прошу помогите!!!

Упуаут
Оракул
(66595)
Bibi Bakala, все просто, обьяви список, например list
list=[]
используй добавление в конец списка list.append()
это можно сделать циклом for его ты знаешь

просто овощ

Гуру

(2816)


2 года назад

1) заносить не в отдельную переменную, а в список
2) по окончанию ввода отсортировать список через .sort()
3) вывести последний элемент отсортированного списка: *a[:1]

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