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.
Есть такое задание:
Запросить ввод k чисел. Вводить можно отрицательные, положительные
числа, ноль. Числа могут повторяться. Найти количество отрицательных
чисел среди вводимых. Вывести ответ с пояснением.
В программе используется оператор цикла for
, оператор проверки условия if
…
Вот код, до которого я дошел:
k = int(input('Введите любое число '))
a = 0
for k in range(k, 1):
if k < 0:
print(k)
Как это сделать правильно?
Jack_oS
12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков
задан 20 апр 2021 в 7:39
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_oSJack_oS
12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков
1
Функциональным стилем в одну строку чисто по приколу:
print('Отрицательных чисел:', sum(map(lambda x: int(input('Введите число: ')) < 0, range(int(input('Введите количество чисел: '))))))
ответ дан 20 апр 2021 в 8:29
CrazyElfCrazyElf
65.4k5 золотых знаков19 серебряных знаков50 бронзовых знаков
a = 0
for i in range(int(input('Введите любое число: '))):
a += int(input()) < 0
print(a)
ответ дан 20 апр 2021 в 7:46
KuchizuKuchizu
1,1986 серебряных знаков13 бронзовых знаков
1
Как найти наименьшее отрицательное значение?
Все работает, кроме нахождения наименьшего отрицательного элемента, помогите пожалуйста.
Код программы
a=[]
print('Введите количество значений в массиве')
n=int(input())
for i in range(n):
print("Введите значение "+str(i+1))
a.append(int(input()))
print("Введенные числа "+str(a))
res=[]
mx=0
for i in range(len(a)):
if a[i]<0:
res+=[i]
if len(res)>0:
for i in range(len(res)):
if res[i]<mx:
mx=res[i]
print("отрицательные числа под номерами "+str(res))
print(mx)
else:
print("Не нашли")
-
Вопрос заданболее двух лет назад
-
126 просмотров
Как найти наименьшее отрицательное значение?
Все работает, кроме нахождения наименьшего отрицательного элемента
Интересная формулировка 😉
Проблема здесь:
if a[i]<0:
res+=[i]
В этом цикле ведь i – это не значение (число), а индекс числа. Т.е. в список отрицательных чисел попадают не сами числа, а их индексы. Думаю, понятно, как исправить?
И вообще, для перебора самих элементов списка не нужно прибегать к конструкциям range(len(a)), можно перебирать сами элементы:
for n in a:
if n<0:
...
Пригласить эксперта
min(a)
А в вашем коде вы индекс элемента с mx сравниваете, а не значение
-
Показать ещё
Загружается…
21 мая 2023, в 13:31
350 руб./за проект
21 мая 2023, в 13:02
4000 руб./за проект
21 мая 2023, в 12:40
5000 руб./за проект
Минуточку внимания
Пускай имеется такая задача: дан список с численными элементами. Требуется найти и вернуть первый отрицательный элемент. Казалось бы, должна быть какая-нибудь встроенная функция для этого, но нет. Придется писать ее самим. Решение в лоб:
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 340
Bibi Bakala
Мыслитель
(5073),
закрыт
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)
Упуаут
Оракул
(66591)
2 года назад
загони все числа в список, подключи import statistics там есть поиск минимума
Bibi BakalaМыслитель (5073)
2 года назад
Как? Прошу помогите! Я не дошел до темы списков (
Прошу помогите!!!
Упуаут
Оракул
(66591)
Bibi Bakala, все просто, обьяви список, например list
list=[]
используй добавление в конец списка list.append()
это можно сделать циклом for его ты знаешь
просто овощ
Гуру
(2816)
2 года назад
1) заносить не в отдельную переменную, а в список
2) по окончанию ввода отсортировать список через .sort()
3) вывести последний элемент отсортированного списка: *a[:1]